NestJSに設定モジュール追加
NestJSに設定モジュールを追加して環境変数をバリデーションする方法等のメモ
TL;DL
- @nestjs/configを使いましょう
- 環境変数のバリデーションをしましょう
- 環境変数もDIしましょう
- 詳細はこちらのPRから確認できます
全体の流れ
公式ドキュメントを参考に以下の流れで導入します。
依存パッケージのインストール
# config用
yarn add @nestjs/config
# バリデーション用
yarn add joi
設定モジュールを全体適用
// app.module.ts
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
// 設定モジュールを全体適用し後述のvalidationSchemaで環境変数をバリデーション
ConfigModule.forRoot({ isGlobal: true, cache: true, validationSchema }),
],
})
export class AppModule {}
設定サービスの作成
// /src/modules/configs/configs.service.ts 等
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class ApiConfigService {
constructor(private configService: ConfigService) {}
// required
get NODE_ENV(): string {
return this.configService.get('NODE_ENV');
}
// optional
get SERVER_PORT(): number {
console.log(typeof this.configService.get('SERVER_PORT'));
return this.configService.get('SERVER_PORT');
}
}
バリデータの追加
// /src/modules/configs/configs.validator.ts 等
import * as Joi from 'joi';
export const validationSchema = Joi.object({
// required
NODE_ENV: Joi.string()
.required()
.valid('development', 'production', 'test'),
// optional
SERVER_PORT: Joi.number(),
});
プロバイダに設定サービス追加
{
// ...snip
providers: [SomeService, ApiConfigService]
}
コンストラクタに設定サービス追加
// ...snip
constructor(private readonly apiConfigService: ApiConfigService) {}