Configuration
NestJS 官方提供了 @nestjs/config
來管理環境變數, 這樣可以讓我們將環境變數集中管理, 並且可以在不同的環境中使用不同的設定檔
1. 安装所需套件
pnpm add i @nestjs/config
2. 將機密資訊設定在 config/env 中
env
記得不要放到 cloud:
.env
APP_DOMAIN=YOUR_DOMAIN
SAME_DOMAIN=${APP_DOMAIN}
NODE_ENV=development
SSL=false
TIME_ZONE=
在 src/config 新增 configuration.factory.ts
及 configuration.import.ts
:
configuration.factory.ts
import { registerAs } from '@nestjs/config';
export const generalConfigFactory = registerAs('general', () => {
return {
apiPrefix: 'api',
env: process.env.NODE_ENV || 'development',
port: parseInt(process.env.PORT, 10) || 1240,
timeZone: process.env.TIME_ZONE || 'Asia/Taipei'
};
});
configuration.factory.ts
主要放我們所有的設定邏輯- registerAs 是一個 helper function, 用來將設定檔註冊到 config service 中, 並且可以分類設定檔 (general), 以及可以先處理相關邏輯後再將最後的值回傳出去
configuration.import.ts
import { ConfigModule, ConfigService } from '@nestjs/config';
import { generalConfigFactory } from './configuration.factory';
export function loadConfigImports() {
return [
ConfigModule.forRoot({
envFilePath: ['.env', '.env.staging', '.env.prod'],
isGlobal: true,
load: [generalConfigFactory],
expandVariables: true // Enable environment variable expansion
})
];
}
- 這邊我們將要 import 進
AppModule
的相關設定拉出來成額外一個 func, 其中ConfigModule
是用來註冊環境變數, 並且可以設定環境變數的優先順序, 以及是否要全域使用. 其中我們設定了isGlobal: true
代表所有地方都可以使用到環境變數, 並且設定了load: [generalConfigFactory]
代表我們要將generalConfigFactory
註冊到 config service 中, 這樣我們就可以在任何地方使用ConfigService
來取得環境變數, 而expandVariables
是可以讓 env 檔案可以有解析環境變數檔, 讓環境變數檔透過${...}
達到使用有變數宣告來擴展變數的功能 (ex:SAME_DOMAIN=${APP_DOMAIN}
)
上面設定完後, 將其 import 到 AppModule
:
app.module.ts
import { loadConfigImports } from '@/config/configuration.import';
@Module({
imports: [...loadConfigImports()]
//. ..
})
export class AppModule {}
這樣我們就完成了 Config 的設定, 我們可以從 main.ts
來查看設定是否正確:
main.ts
import { ConfigService } from '@nestjs/config';
import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
const configService = app.get(ConfigService); // 從 ConfigService 取得環境變數
const port = configService.get<number>('general.port');
const globalApiPrefix = configService.get<string>('general.apiPrefix');
const env = configService.get<string>('general.env');
app.setGlobalPrefix(globalApiPrefix);
console.log(`Server is running on ${env} mode.`);
await app.listen(port);
}
bootstrap();