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) {}