【NestJS】配置信息與環境變量

NestJS項目中推薦使用nestjs-config模塊來獲取配置。git

nestjs-config 提供了 config.get() 函數,可經過config.get('app.host')的方式來讀取配置。github

nestjs-config 地址:github.com/nestjs-comm…數據庫

最佳實踐

獲取配置

通常來講,在程序中有如下方式能夠獲取配置:服務器

  1. 硬代碼,直接寫死。- ❌ 可維護性低
  2. 寫死在ts文件,例如config/app.ts中。 - ❌ 沒法區分環境進行配置
  3. 直接讀取.env文件。 - ❌ 雖然解決了環境變量問題可是不推薦
  4. 環境變量存儲在 .env中,配置信息保存在ts文件中,而後使用 config.get() 函數來讀取。- ✅ 最佳實踐

編碼規範

在此統一規定:全部程序配置信息 必須 經過 config.get() 來讀取,毫不在配置文件之外的範圍讀取環境變量。app

設計理念

這樣作主要有如下幾個優點:函數

  1. 定義分明,config.get() 讀取的是配置信息。.env 文件保存的是環境變量,在不一樣環境下能夠配置不一樣的內容。
  2. 代碼健壯性, config.get() 在 .env 文件之上多出來一個抽象層,會使代碼更加健壯,更加靈活。

nestjs-config

引入方式

// app.module.ts 加載config文件夾中的配置文件

import { ConfigModule } from 'nestjs-config'
// 注意,這裏路徑要指向存放配置文件的config文件夾
ConfigModule.load(path.resolve(__dirname, '..', 'config', '**/!(*.d).{ts,js}')),
複製代碼

使用示例

  1. .env文件用於配置各類線上敏感數據和服務器定製化數據,例如數據庫密碼,祕鑰,服務器ip等
  2. 經過dotenv庫讀取env文件中的環境變量並進行格式化,封裝成通用的方法
// env-unit.ts
  import * as dotenv from 'dotenv'
  
  dotenv.config()
  
  /** * 格式化環境變量 * @param key 環境變量的鍵值 * @param defaultValue 默認值 * @param callback 格式化函數 */
  const fromatValue = <T>(key: string, defaultValue: T, callback: (value: string) => T): T => {
      const value: string | undefined = process.env[key]
      if (typeof value === 'undefined') {
          return defaultValue
      }
      return callback(value)
  }
  
  export const env = (key: string, defaultValue: string = '') => fromatValue(key, defaultValue, value => value)
  
  export const envNumber = (key: string, defaultValue: number = 0) => fromatValue(key, defaultValue, value => Number(value))
  
  export const envBoolean = (key: string, defaultValue: boolean = false) => fromatValue(key, defaultValue, value => value === 'true')
複製代碼
  1. 在config文件夾下新建app.ts, 經過使用env(), envNumber(),envBoolean()方法來讀取.env並格式化配置,同時第二個參數可設置默認值
// config/app.ts
export {
  port: envNumber('APP_PORT', 3000)
}
複製代碼
  1. 在service中經過依賴注入的方式使用config
import {InjectConfig} from 'nestjs-config';

@Injectable()
class SomeService {
  constructor(@InjectConfig() private readonly config) {
  }
  getAppHost() {
    // 使用字符串加.的格式獲取配置
    return this.config.get('app.port')
  }
}
複製代碼
相關文章
相關標籤/搜索