如何使用提供者内部的 ConfigModule 读取配置值?

How to read config value using ConfigModule inside of a provider?

我想向我的 nestjs 应用程序添加一个配置模块,并在我的数据库模块中使用一些配置。

例如我想获取配置的主机值: 在 class 中,我可以执行 const dbHost = this.configService.get<string>('database.host');,但在我的代码中,我需要提供程序内部的值。如何获取提供程序内部的配置值?

app.module.ts

@Module({
  imports: [
    DatabaseModule,
    ConfigModule.forRoot({
      load: [configuration],
    }),
  ],
})
export class AppModule {}

database.module.ts

import { Module, Inject } from '@nestjs/common'
import { MongoClient, MongoClientOptions, Db, Logger } from 'mongodb'

@Module({
  providers: [
    {
      provide: 'DATABASE_CLIENT',
      useFactory: () => ({ client: null })
    },
    {
      provide: 'DATABASE_CONNECTION',
      inject: ['DATABASE_CLIENT'],
      useFactory: async (dbClient): Promise<Db> => {
        Logger.setLevel('debug')

        // How do I get the host value of my config?

        const mongo: string = 'mongodb://127.0.0.1:27017'
        const database: string = 'data'
        const options: MongoClientOptions = {}
        const client = new MongoClient(mongo, options)
        await client.connect()
        const db = client.db(database)
        return db
      }
    }
  ],
  exports: ['DATABASE_CONNECTION', 'DATABASE_CLIENT'],
  import: [ConfigModule]
})
export class DatabaseModule {
  constructor(@Inject('DATABASE_CLIENT') private dbClient) {}

  onApplicationShutdown(signal: string) {
    if (signal) console.log(signal + ' signal recieved')
  }
}

在您的 inject 中添加 ConfigService,然后它将成为 useFactory 参数的第二个值。

@Module({
  providers: [
    {
      provide: 'DATABASE_CLIENT',
      useFactory: () => ({ client: null })
    },
    {
      provide: 'DATABASE_CONNECTION',
      inject: ['DATABASE_CLIENT', ConfigService],
      useFactory: async (dbClient, config: ConfigService): Promise<Db> => {
        Logger.setLevel('debug')

       const dbHost = config.get('database.host')

        const mongo: string = 'mongodb://127.0.0.1:27017'
        const database: string = 'data'
        const options: MongoClientOptions = {}
        const client = new MongoClient(mongo, options)
        await client.connect()
        const db = client.db(database)
        return db
      }
    }
  ],
  exports: ['DATABASE_CONNECTION', 'DATABASE_CLIENT'],
  import: [ConfigModule]
})
export class DatabaseModule {
  constructor(@Inject('DATABASE_CLIENT') private dbClient) {}

  onApplicationShutdown(signal: string) {
    if (signal) console.log(signal + ' signal recieved')
  }
}