先说一下在某一个模块中调用另一个模块的方法:
// 模块入口文件 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.ts 即 CatsModule。
@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 {}
这样就能解决了,不过官方不推荐模块间用这种方法互相调用。