我的 NestJS 项目中定义了一堆服务。其中一些服务在许多其他服务中用作公共服务。因此它们也被导入到一些模块中。但我注意到,当特定服务
srvD
导入到另一个服务 srvE2
中时,项目启动时不会调用 onModuleInit
。
项目启动没有任何错误。不太确定发生了什么。
项目结构示例。问题在
srvE2
srvA.ts
@Injectable()
export class SrvA {
constructor(
private somePkgSrv: SomePkgSrv,
) {}
}
srvB.ts
@Injectable()
export class SrvB {
constructor(
private srvA: SrvA,
) {}
}
srvC.ts
@Injectable()
export class SrvC {
constructor(
private srvA: SrvA,
private srvB: SrvB,
) {}
}
srvD.ts
@Injectable()
export class SrvD {
constructor(
private srvA: SrvA,
private srvB: SrvB,
private srvC: SrvC,
) {}
}
srvD.module.ts
@Module({
providers: [SrvA, SrvB, SrvC, SrvD],
exports: [SrvD],
})
srvE1.ts
export class SrvE1 implements OnModuleInit {
constructor(
private srvA: SrvA,
private srvB: SrvB,
private srvC: SrvC,
) {}
async onModuleInit() {
console.log ('I can print! Yay!')
}
}
srvE2.ts
export class SrvE2 implements OnModuleInit {
constructor(
private srvA: SrvA,
private srvB: SrvB,
private srvC: SrvC,
private srvD: SrvD,
) {}
async onModuleInit() {
console.log ('I refuse to print so long as SrvD is here. Comment it and I will
print')
}
}
srvE.module.ts
@Module({
import: [SrvD], // the module
providers: [SrvE1, SrvE2], // the services
exports: [SrvE1, SrvE2],
})
请求范围的提供者将此范围扩展到整个注入链。因此,如果您使用它,即使在代码深处,
onModuleInit
也不会运行。
话虽这么说,嗯……从性能角度来看,不推荐使用请求范围。这是一篇有趣的文章:为什么你应该避免在 NestJS 中使用请求范围注入
我也遇到了这个问题及其答案:如何在 NestJS 控制器中注入请求范围的提供程序?
我已经尝试过 @profes 的
nj-request-scope
包,它工作得很好,特别是可以解决你的问题。
如果您不想使用它,您仍然可以尝试将您的
onModuleInit
代码移动到默认范围的服务中。
我正在处理类似的问题。根据此处的评论,我尝试将新依赖项的范围从
Scope.REQUEST
更改为 Scope.DEFAULT
,这解决了我的问题。
如果您正在运行混合应用程序或任何微服务而没有
Scope.REQUEST
,则可以在创建 Nest 应用程序后添加此内容;
...
app.init()
...
查看此处了解更多信息,https://github.com/nestjs/nest/issues/410