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

Thi*_*lvo 4 nrwl nestjs

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

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

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

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

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

这在内部工作正常AppService(根模块中的服务),但在任何子模块中都没有。

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

app.module.ts

@Module({
  imports: [
    FeatureModule
  ],
  controllers: [
    AppController
  ],
  providers: [
    AppService,
    {
      provide: 'MY-TOKEN',
      useValue: 'my-injected-value',
    }
  ],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

功能模块.ts

@Module({
  imports: [],
  controllers: [],
  providers: [
    FeatureService
  ],
})
export class FeatureModule {
}
Run Code Online (Sandbox Code Playgroud)

功能.service.ts

@Injectable()
export class AppService {
  constructor(
    @Inject('MY-TOKEN') private injectedValue: string
  ) {}
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*ski 7

引自 NestJS官方文档

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

因此,您可以做的只是使用该MY-TOKEN提供程序定义一个全局模块:


@Global()
@Module({  
  providers: [
    {
      provide: 'MY-TOKEN',
      useValue: 'my-injected-value',
    }
  ],
  exports: ['MY-TOKEN'],
})
export class GlobalModule {}
Run Code Online (Sandbox Code Playgroud)

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

  • @KentWood 由于某种原因不起作用。需要将全局模块导入到app.module中,如果将全局装饰器放在app.module上,则不会发生任何变化 (2认同)