我在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],
})
2条答案
按热度按时间1dkrff031#
我正在处理一个类似的问题。根据这里的评论,我尝试将新依赖项的作用域从
Scope.REQUEST
更改为Scope.DEFAULT
,这解决了我的问题。bmp9r5qi2#
请求作用域提供者将这个作用域扩展到整个注入链,因此,如果你使用它,即使深入到代码内部,
onModuleInit
也不会运行。话虽如此,但就性能而言,并不推荐使用request scope。下面是一篇有趣的文章:Why You Should Avoid Using Request-scoped Injection in NestJS
我也碰到了这个问题&它的答案:How to inject a request scoped provider at NestJS controller?
我试过@profes的
nj-request-scope
包,它工作得很好,特别是修复了你的问题。如果您不想使用它,您仍然可以尝试将
onModuleInit
代码移到默认作用域服务中。