8

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

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

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

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 {}

功能模块.ts

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

功能.service.ts

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

1 回答 1

9

引用 NestJS官方文档

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

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


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

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

于 2019-03-29T08:48:35.943 回答