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

时间:2019-03-29 07:57:47

标签: nestjs nrwl

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

最终目标是重现与vsavkin mentioned for Angular

类似的配置管理方式

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

  

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

如何通知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 个答案:

答案 0 :(得分:1)

NestJS official documentation的报价:

  

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

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


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

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