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

Posted

技术标签:

【中文标题】如何在 NestJS 中跨模块全局注入价值?【英文标题】:How to globally inject value across modules in NestJS? 【发布时间】:2019-08-20 02:58:58 【问题描述】:

我正在使用 nx 工作区和 nestjs。 我想在 Nestjs 应用程序的多个模块中注入一个值。

最终目标是重现与vsavkin mentioned for Angular类似的配置管理方式

但这似乎不可能,或者我错过了一些东西。

Nest 无法解析 FeatureService (?) 的依赖关系。请做出来 确保索引 [0] 处的参数在 FeatureModule 中可用 上下文。

我如何通知FeatureModule 它需要访问这个全局注入值?

这在AppService(根模块中的服务)中运行良好,但在任何子模块中都没有。

下面是我的代码。 或codesandbox.io 上的完整示例

app.module.ts

@Module(
  imports: [
    FeatureModule
  ],
  controllers: [
    AppController
  ],
  providers: [
    AppService,
    
      provide: 'MY-TOKEN',
      useValue: 'my-injected-value',
    
  ],
)
export class AppModule 

feature.module.ts

@Module(
  imports: [],
  controllers: [],
  providers: [
    FeatureService
  ],
)
export class FeatureModule 

feature.service.ts

@Injectable()
export class AppService 
  constructor(
    @Inject('MY-TOKEN') private injectedValue: string
  ) 

【问题讨论】:

【参考方案1】:

引用 NestJS official documentation:

在 Angular 中,提供程序在全局范围内注册。一旦定义,它们在任何地方都可用。另一方面,Nest 将提供程序封装在模块范围内。如果不导入它们,您将无法在其他地方使用模块提供程序。但有时,您可能只想提供一组应该始终可用的东西——开箱即用,例如:助手、数据库连接等等。这就是为什么您能够使该模块成为全球性的

所以你可以做的就是用MY-TOKEN提供者定义一个全局模块:


@Global()
@Module(  
  providers: [
    
      provide: 'MY-TOKEN',
      useValue: 'my-injected-value',
    
  ],
  exports: ['MY-TOKEN'],
)
export class GlobalModule 

然后您可以使用其导出的值,而无需在任何地方导入全局模块。

【讨论】:

像魅力一样工作。为什么我没想到!非常感谢卡罗尔。 ;-) 直接将应用模块设置为全局模块,而不是新建一个模块,可以吗? @KentWood 由于某种原因无法正常工作。需要将全局模块导入到app.module中,如果你在app.module上放了全局装饰器,没有任何变化

以上是关于如何在 NestJS 中跨模块全局注入价值?的主要内容,如果未能解决你的问题,请参考以下文章

NestJS:如何从同一个模块将服务注入提供者?

如何使用 NestJS 为特定模块添加路由前缀?

如果模型仅在根模块中,如何注入模型

如果模型仅在根模块中,如何注入模型

nestjs 全局 pubsub 实例和依赖注入

NestJS 在非模块文件中注入模块服务