https://github.com/nestjsx/nestjs-config
https://www.jianshu.com/p/01c9db1f462e
NestJS项目中推荐使用nestjs-config模块来获取配置。
nestjs-config 提供了 config.get() 函数,可通过config.get(‘app.host’)的方式来读取配置。
nestjs-config 地址:github.com/nestjs-comm…

最佳实践

获取配置

一般来说,在程序中有以下方式可以获取配置:

  1. 硬代码,直接写死。- ❌ 可维护性低
  2. 写死在ts文件,例如config/app.ts中。 - ❌ 无法区分环境进行配置
  3. 直接读取.env文件。 - ❌ 虽然解决了环境变量问题但是不推荐
  4. 环境变量存储在 .env中,配置信息保存在ts文件中,然后使用 config.get() 函数来读取。- ✅ 最佳实践

    编码规范

    在此统一规定:所有程序配置信息 必须 通过 config.get() 来读取,绝不在配置文件以外的范围读取环境变量。

    设计理念

    这样做主要有以下几个优势:

  5. 定义分明,config.get() 是配置信息,.env 文件只是用来区分不同环境;

  6. 代码健壮性, config.get() 在 .env 文件之上多出来一个抽象层,会使代码更加健壮,更加灵活。

    nestjs-config

    引入方式

    1. // app.module.ts 加载config文件夹中的配置文件
    2. ConfigModule.load(path.resolve(__dirname, '..', 'config', '**/!(*.d).{ts,js}')),
    3. 复制代码

    使用示例

  7. .env文件用于配置各种线上敏感数据和服务器定制化数据,例如数据库密码,秘钥,服务器ip等

  8. 通过dotenv库读取env文件中的环境变量并进行格式化,封装成通用的方法

    1. // env-unit.ts
    2. import * as dotenv from 'dotenv'
    3. dotenv.config()
    4. /**
    5. * 格式化环境变量
    6. * @param key 环境变量的键值
    7. * @param defaultValue 默认值
    8. * @param callback 格式化函数
    9. */
    10. const fromatValue = <T>(key: string, defaultValue: T, callback: (value: string) => T): T => {
    11. const value: string | undefined = process.env[key]
    12. if (typeof value === 'undefined') {
    13. return defaultValue
    14. }
    15. return callback(value)
    16. }
    17. export const env = (key: string, defaultValue: string = '') => fromatValue(key, defaultValue, value => value)
    18. export const envNumber = (key: string, defaultValue: number = 0) => fromatValue(key, defaultValue, value => Number(value))
    19. export const envBoolean = (key: string, defaultValue: boolean = false) => fromatValue(key, defaultValue, value => value === 'true')
    20. 复制代码
  9. 在config文件夹下新建app.ts, 通过使用env(), envNumber(),envBoolean()方法来读取.env并格式化配置,同时第二个参数可设置默认值

    1. // config/app.ts
    2. export {
    3. host: envNumber('DB_HOST', 3306)
    4. }
    5. 复制代码
  10. 在service中通过依赖注入的方式使用config

    1. import {InjectConfig} from 'nestjs-config';
    2. @Injectable()
    3. class SomeService {
    4. constructor(@InjectConfig() private readonly config) {
    5. }
    6. getAppHost() {
    7. // 使用字符串加.的格式获取配置
    8. return this.config.get('app.host')
    9. }
    10. }
    11. 复制代码