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 实例和依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
使用 Prisma 2 和 NestJS 进行日志记录 - 依赖注入问题?