Configuration - 自定義設定檔模組
Config 環境變數
在 NestJS 專案裡要讀取外部 專案時,和一般的 Node.js 專案一樣常常會透過 .env 將環境變數儲存在裡面,並在程式裡使用 process.env 來讀取相對應的變數,而 NestJS 也提供了 config 模組讓我們可以把關於組讓我的相關邏輯整合起來,在使用上也會更加簡潔~
安裝
首先我們需要在專案內先安裝好 NestJS 官方提供的 config 套件:
$ npm i --save @nestjs/config
這個套件在內部本身就使用了 dotenv 來實現環境變數讀取的邏輯。
基本使用
config 基本的使用方式相當簡單,只需要在 module 的地方將 ConfigModule 給載入進來就可以使用了。這邊的 .fotRoot() 如果沒有填入內容的話,預設會自動讀取根目錄底下的 .env,而若有不同檔名的設定檔,或是針對不同環境使用多個設定檔的需求 (例如常見的 .local、.production 的區分),也可以在裡面進行設定。
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ConfigModule.forRoot({ envFilePath: ['.env.local', '.env.production'] })], }) export class AppModule {}
envFilePath 的值可以是單一字串或陣列,如果以陣列形式輸入的話,會按照排序為優先順序來尋找對應的設定檔來載入。至於取值的方法,則是透過載入 ConfigService 並使用 get() 方法來取得變數值。
// controller/service.ts constructor(private configService: ConfigService) {} // ... const username = this.configService.get<string>('USERNAME');
自定義命名空間
在使用 .env 來獲取環境變數值的時候,一般都會是以全大寫的方式來將 key 值傳入,如果想要更系統化的處理取值的操作,可以使用自定義的 configuration 來達成,首先會需要建立一個 config 檔案,並透過 NestJS config 套件中的 registerAs 來處理:
// user.config.ts import { registerAs } from '@nestjs/config'; export default registerAs('user', () => { const username = process.env.USERNAME || ''; const password = process.env.PASSWORD || ''; return { username, password }; });
此處 registerAs 的第一個參數即為自定義 namespace 的名稱,而下面則是底下讀取進來的變數值。在使用之前需要先在 module 把這個自定義的 config 載入進來,後續就可以透過自定義的命名來引用變數了~
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import UserConfigFactory from 'src/config/user.config'; @Module({ imports: [ConfigModule.forRoot({ load: [UserConfigFactory] })], }) export class AppModule {}
// controller/service.ts constructor(private configService: ConfigService) {} // ... const username = this.configService.get<string>('user.username');