nestjs 全局 pubsub 实例和依赖注入

Posted

技术标签:

【中文标题】nestjs 全局 pubsub 实例和依赖注入【英文标题】:nestjs global pubsub instance and dependency injection 【发布时间】:2020-03-25 00:43:06 【问题描述】:

我关注了有关 pubsub/subsciprtions 的 Nestjs DOCS:

根据示例,pubsub 在给定解析器的顶部初始化:

const pubSub = new PubSub();

后来文档说:

“我们在这里使用了本地 PubSub 实例。相反,我们应该将 PubSub 定义为提供者,通过构造函数注入它(使用 @Inject() 装饰器),并在整个应用程序中重用它”


  provide: 'PUB_SUB',
  useValue: new PubSub(),

这会去哪里? IE。如何在我的主 app.module 中提供它以便在所有其他模块中都可用的语法/方法是什么?

如果我尝试在不同的模块中将此作为依赖项提供,我会遇到依赖项解析问题。 app.module

  providers: [
    AppService,
    
      provide: APP_FILTER,
      useClass: AllExceptionsFilter,
    ,
    
      provide: 'PUB_SUB',
      useValue: new PubSub(),
    ,

some-resolver.js

  constructor(
    @Inject('PUB_SUB')
    private pubSub: PubSub,

给出: Nest 无法解析 MyResolver 的依赖项( MyResolver 由 MyModule 提供

我无法将 appmodule 导入 MyModule,否则我将创建循环依赖。

我是否定义了一个只提供 pub_sub 实例的新模块?

【问题讨论】:

【参考方案1】:

如果您希望它可以轻松地用于所有其他模块,我建议创建一个 PubSubModule 来提供您的 PubSub 并在您想要导入模块时导出它,或者只是标记为@Global()的模块,因此可以在任何地方注入PubSub

导出方法

@Module(
  providers: [
    
      provide: 'PUB_SUB',
      useClass: PubSub,
      // useValue: new PubSub(),
      // useFactory: () => 
      //  return new PubSub();
      // 
    
  ],
  exports: ['PUB_SUB'],
)
export class PubSubModule 

全局方法

@Global()
@Module(
  providers: [
    
      provide: 'PUB_SUB',
      useClass: PubSub,
      // useValue: new PubSub(),
      // useFactory: () => 
      //  return new PubSub();
      // 
    
  ],
)
export class PubSubModule 

【讨论】:

非常感谢,这确实是我登陆的地方。使用全局装饰器有什么缺点?在 appmodule 中完成的其他模块实例化,如 typeorm、graphql 等似乎不遵循这种模式。再次在文档中,nest 团队没有提到将其用于自定义记录器。在主 app.module 中配置后,某些功能如何“神奇地”可用仍然很模糊。到目前为止,这是我使用“全局”装饰器的唯一实例 我真的没有看到它的缺点,除了像你说的那样,它“神奇地”可用。实际上,我最近与一位贡献者合作,想出一种使用 Global 的方法,但仍然只使用一次配置。我不喜欢使用@global(),只是因为它让我思考在当前范围内真正可用的东西

以上是关于nestjs 全局 pubsub 实例和依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJS 中跨模块全局注入价值?

NestJS:依赖注入和提供者注册

Nestjs 依赖注入和 DDD / 清洁架构

使用 Prisma 2 和 NestJS 进行日志记录 - 依赖注入问题?

nestjs 单元测试 createTestingModule 依赖注入

Nestjs 依赖注入 - 将服务注入服务