【问题标题】:How to create a Nestjs module based on async config?如何基于异步配置创建 Nestjs 模块?
【发布时间】:2022-07-06 23:15:23
【问题描述】:

我正在尝试像这样创建一个数据库模块:

const dbProvider = {
  provide: 'DB',
  useFactory: async (configService:ConfigService) => {
    const dbUrl = configService.get<string>('DB_URL')
    return Knex({
      client: 'pg',
      connection: dbUrl
    })
  },
  inject: [ConfigService]
}

@Module({
  providers: [ConfigService, dbProvider],
  exports: [dbProvider],
})
export class DbModule {}

问题在于配置服务需要异步获取 DB_URL 参数(来自 AWS 秘密存储)。

数据库设置完成后,配置仍未加载(稍后会发生)。 这是 AppModule 的定义:

@Module({
  controllers: [AppController],
  providers: [Logger, AppService, {
    provide: ConfigService,
    useFactory: getConfigFactory(['DB_URL']),
  }],
  exports: [ConfigService]
})
export class AppModule {}

有没有正确的 Nestjs 方法来实现这样的功能?

【问题讨论】:

    标签: asynchronous nestjs config


    【解决方案1】:

    查看ConfigModule/ConfigService 的语法,您似乎正在使用@nestjs/config 模块。

    https://docs.nestjs.com/techniques/configuration

    奇怪的是 DbModule 不导入 ConfigModule 除非您将其作为全局模块加载到其他地方。

    我将在DbModule 中导入ConfigModule,然后在返回Knex 实例的工厂函数中注入ConfigService。那时您应该能够读取ConfigService 从您的.env 文件中读取的环境变量。

    @Module({
      imports: [ConfigModule.forRoot()],
      providers: [
        {
          provide: DB_TOKEN,
          useFactory: (config: ConfigService) => {
            const url = config.get<string>('DB_URL');
            return Knex({...})
          },
          inject: [ConfigService],
        },
      ],
      exports: [DB_TOKEN],
    })
    export class DbModule {}
    

    然后在AppModule中导入DbModule

    @Module({
      imports: [DbModule],
      controllers: [AppController],
      providers: [...]
    })
    export class AppModule {}
    

    然后,您可以将DB_TOKEN 标识的提供程序注入您的提供程序中,这些提供程序是AppModule 的一部分。

    【讨论】:

      猜你喜欢
      • 2019-10-31
      • 2022-12-30
      • 2021-10-26
      • 2015-10-13
      • 1970-01-01
      • 2019-06-15
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多