在NestJS模块中使用配置服务的最佳做法

时间:2018-11-22 08:15:33

标签: javascript node.js typescript nestjs

我想使用环境变量从docs配置每个模块的HttpModule,我可以使用如下配置:

@Module({
  imports: [HttpModule.register({
    timeout: 5000,
    maxRedirects: 5,
  })],
})

但是我不知道从环境可变(或配置服务)中插入baseURL的最佳做法是什么,例如:

@Module({
imports: [HttpModule.register({
    baseURL:  this.config.get('API_BASE_URL'),
    timeout: 5000,
    maxRedirects: 5,
})],

this.configundefined,因为它不在课堂上。

从环境变量(或配置服务)设置baseURL的最佳实践是什么?

2 个答案:

答案 0 :(得分:3)

更新1月19日

HttpModule.registerAsync()是在版本5.5.0中与此pull request添加的。

HttpModule.registerAsync({
  imports:[ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    baseURL:  this.config.get('API_BASE_URL'),
    timeout: 5000,
    maxRedirects: 5,
  }),
  inject: [ConfigService]
}),

原始帖子

此问题在issue中进行了讨论。对于TypeOrmModuleMongooseModule之类的nestjs模块,实现了以下模式。

useFactory方法返回配置对象。

TypeOrmModule.forRootAsync({
  imports:[ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    type: configService.getDatabase()
  }),
  inject: [ConfigService]
}),

尽管卡米尔wrote

  

以上约定现在适用于所有嵌套模块,并且将   被视为最佳做法(对第三方模块的推荐)。   文档中的更多内容

它似乎还没有为HttpModule实现,但是也许您可以提出一个问题。我在上面提到的问题中还有其他建议。

还可以查看官方docs以及有关如何实现ConfigService的最佳实践。

答案 1 :(得分:0)

我在实现ConfigService时也遇到了几个问题,如NestJS文档中所述(没有类型安全性,没有配置值的模块化,...),我写下了公司最终的NestJS配置管理策略。此处非常详细:NestJS Configuration Management

基本思想是拥有一个中央配置模块,该模块可从流程环境中加载所有配置值。但是,代替为所有模块提供单一服务,每个模块可以注入配置值的专用子集!因此,每个模块都包含一个类,该类指定运行时需要提供此模块的所有配置值。同时,这使开发人员可以通过类型安全的方式访问配置值(而不是在整个代码库中使用字符串文字)

希望这种模式也适用于您的用例:)