将特定服务添加到构造函数时,NestJS onModuleInit 不起作用

问题描述 投票:0回答:3

我的 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],
})
node.js service nestjs
3个回答
2
投票

请求范围的提供者将此范围扩展到整个注入链。因此,如果您使用它,即使在代码深处,

onModuleInit
也不会运行。

话虽这么说,嗯……从性能角度来看,不推荐使用请求范围。这是一篇有趣的文章:为什么你应该避免在 NestJS 中使用请求范围注入

我也遇到了这个问题及其答案:如何在 NestJS 控制器中注入请求范围的提供程序?

我已经尝试过 @profes 的

nj-request-scope
包,它工作得很好,特别是可以解决你的问题。

如果您不想使用它,您仍然可以尝试将您的

onModuleInit
代码移动到默认范围的服务中。


0
投票

我正在处理类似的问题。根据此处的评论,我尝试将新依赖项的范围从

Scope.REQUEST
更改为
Scope.DEFAULT
,这解决了我的问题。


0
投票

如果您正在运行混合应用程序或任何微服务而没有

Scope.REQUEST
,则可以在创建 Nest 应用程序后添加此内容;

...
app.init()
...

查看此处了解更多信息,https://github.com/nestjs/nest/issues/410

© www.soinside.com 2019 - 2024. All rights reserved.