Skip to content

自定义 ConfigService 获得更加友好的代码提示

使用@nestjs/config模块时,我们得不到对应的代码提示,这时我们需要经常到.env文件中查看对应的 key 值并复制过来。我们可以使用一个自定义的 servers 来实现代码提示。

使用命令生成 config 模块和 config 服务 nest new mo config nest new s config

config.module.ts

ts
import { Global, Module } from '@nestjs/common'
import { ConfigModule as NestConfigModule } from '@nestjs/config'
import { ConfigService } from './config.service'
import configs from './data'

@Global()
@Module({
  imports: [NestConfigModule.forRoot({ isGlobal: true, load: [...configs] })],
  providers: [ConfigService],
  exports: [ConfigService],
})
export class ConfigModule {}

config.service.ts

有一个配置项后就需要手动注入该配置项到 ConfigService

ts
import { Inject, Injectable } from '@nestjs/common'
import { ConfigType } from '@nestjs/config'
import { aliyunConfig } from './data/aliyun.config'
import { appConfig } from './data/app.config'

@Injectable()
export class ConfigService {
  constructor(
    @Inject(aliyunConfig.KEY) public aliyun: ConfigType<typeof aliyunConfig>,
    @Inject(appConfig.KEY) public app: ConfigType<typeof appConfig>,
  ) {}
}

使用命名空间自定义配置文件

使用命名空间来定义配置文件,结合env文件来实现代码提示。我这里将配置文件都放置于 config/data 文件夹中

这个 key 值就是使用时的 key

/src/config/data/aliyun.config.ts

ts
import { registerAs } from '@nestjs/config'

export const aliyunConfig = registerAs('aliyun', () => ({
  access_key: process.env.ALIYUN_ACCESS_KEY || '',
  access_secret: process.env.ALIYUN_ACCESS_SECRET || '',
  sms_sign: process.env.ALIYUN_SMS_SIGN || '',
  sms_code_template: process.env.ALIYUN_SMS_CODE_TEMPLATE || '',
  test_phone: process.env.ALIYUN_SMS_TEST_PHONE || '',
}))

/src/config/data/app.config.ts

ts
import { registerAs } from '@nestjs/config'

export const appConfig = registerAs('app', () => ({
  name: 'test_name',
}))

/src/config/data/index.ts

ts
import {aliyunConfig} from './aliyun.config'
import {appConfig} from './app.config'

export [aliyunConfig, appConfig]

使用示例

使用时我们需要在对应的地方注入自定义的 ConfigService

ts
import { ConfigService } from './config/config.service'

class xxService {
  constructor(private readonly config: ConfigService) {}

  // 示例
  getConfig(): string {
    return this.config.aliyun.access_key + this.config.app.name
  }
}

我们也可以继续使用@nestjs/config 的方式来读取配置文件

ts
import { ConfigService } from '@nestjs/config'

class xxService {
  constructor(private readonly config: ConfigService) {}

  // 示例
  getConfig(): string {
    return this.config.get('ALIYUN_ACCESS_KEY')
  }
}