关于nestjs模块之间service互相调用的一个处理方法

9,865 阅读1分钟

先说一下在某一个模块中调用另一个模块的方法:

// 模块入口文件 cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

上面代码是文档里面有写的,主要实现 CatsService 能让其他模块使用的地方就是 exports 这个东西,用来把本模块的 CatsService 导出,暴露出来。其他模块调用,就只需要在入口模块中的 imports 导入 cats.module.tsCatsModule

@Module({
  imports: [CatsModule],
  ...
})
export class CoreModule {}

但是如果 CatsModule 模块也想使用 CoreModule 模块的 CoreService,就不能直接这样用:

// 模块入口文件 cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  imports: [CoreModule],
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

// core.module.ts
@Module({
  imports: [CatsModule],
  exports: [CoreService]
  ...
})
export class CoreModule {}

这样写的结果就是系统报错,程序终止,官方给了一个解决方案 forwardRef

// 模块入口文件 cats.module.ts
import { Module, forwardRef } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  imports: [forwardRef(CoreModule)],
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

// core.module.ts
import { Module, forwardRef } from '@nestjs/common';
@Module({
  imports: [forwardRef(CatsModule)],
  exports: [CoreService]
  ...
})
export class CoreModule {}

这样就能解决了,不过官方不推荐模块间用这种方法互相调用。