【问题标题】:Inject service of parent module in NestJS在 NestJS 中注入父模块的服务
【发布时间】:2020-07-08 23:46:41
【问题描述】:

我在 NestJS 中有三个模块:EndpointModuleJWTModule 和作为模块的特定端点(例如 InfoModule

我的 EndpointModule 如下所示:

@Module({
    imports: [
        JWTModule.withRSAKeys(
            Path.resolveByApp('./private.key'),
            Path.resolveByApp('./public.key')
        ),
        InfoModule,
        //More Endpoints
    ],
    exports: [JWTModule]
})
export class EndpointModule {}

JWTModule 像这样:

@Module({
    providers: [JWTService],
    exports: [JWTService]
})
export class JWTModule {
    static async withRSAKeys(
        privateKeyPath: string,
        publicKeyPath: string
    ): Promise<DynamicModule> {
        return {
            module: JWTModule,
            providers: await this.createProviders(privateKeyPath, publicKeyPath)
        };
    }

如您所见,JWTModule 是一个动态模块。现在我想在我的端点控制器中注入导出的JWTService。例如:

@Module({
    controllers: [InfoController]
})
export class InfoModule {}

@Controller()
export class InfoController {
    constructor(private jwt: JWTService){};

这不起作用。我必须在我的InfoModule 中导入EndpointModule,但这会产生循环依赖。有没有办法避免这种情况?我应该重新排序我的模块吗?

【问题讨论】:

  • 您是否将 JWTModule 添加为 InfoModule 的导入?
  • 我不能这样做,因为 JWTModule 是动态的并且需要参数(例如在 EndpointModule 中)@ChukwumaEzumezu 请在 Maciej 的回答中查看我的评论

标签: dependency-injection nestjs circular-dependency


【解决方案1】:

你需要在InfoModule中导入JWTModule或者用Global()装饰EndpointModule

【讨论】:

  • 我也想到了。但如果我在 InfoModule 中这样做:@Module({ imports: [ JWTModule ] }) 我会出错。它是一个动态模块,需要一些参数(如在 EndpointModule 中)。我可以告诉我的 InfoModule 使用现有的 JWTModule 吗?
  • 只有将 EndpointModule 设为全局。 Nest.js 流程的工作原理是下层模块不知道上层的导入或提供,除非上层模块是全局的。但也许类似的东西会起作用:#InfoModule providers: [{provide: JWTService, useExisting: JWTService}] 但我不知道它是否会起作用,即便如此,这是一种解决方法
  • 你刚刚拯救了我的一天。谢谢!
猜你喜欢
  • 2019-12-26
  • 2019-01-20
  • 2021-04-01
  • 1970-01-01
  • 2020-12-11
  • 2020-09-09
  • 2021-12-29
  • 2019-04-25
  • 2022-11-14
相关资源
最近更新 更多