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

5us2dqdw  于 2023-02-12  发布在  Node.js
关注(0)|答案(2)|浏览(249)

我在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],
})
1dkrff03

1dkrff031#

我正在处理一个类似的问题。根据这里的评论,我尝试将新依赖项的作用域从Scope.REQUEST更改为Scope.DEFAULT,这解决了我的问题。

bmp9r5qi

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代码移到默认作用域服务中。

相关问题