【Nestjs】.envに定義した環境変数をバリデーションする

.envに適切な環境変数が定義されていない時、起動させてないようにしたい要件があったため、バリデーションを追加した。

これを追加すると、起動時にエラーメッセージが表示され、.envの修正を促せるようになる。

目次

.envの定義

.envに任意の環境変数を定義する。

NODE_ENV="development"
DATABASE_URL="<database-url>"
REDIS_EXPIRED=100

EnvValidatorクラスを作成

.envの環境変数のバリデーションクラスを作成します。

EnvValidatorクラスに、.envで定義した環境変数と同じプロパティを定義します。
それぞれのプロパティにバリデートしたい型のアノテーションをつけていきます。

validate関数を呼び出し、エラーをスローすると、アプリケーションは起動できなくなります。

import { plainToClass } from 'class-transformer';
import {
  IsEnum,
  IsNotEmpty,
  IsNumber,
  IsString,
  validateSync,
} from 'class-validator';

enum NodeEnvEnum {
  Development = 'development',
  Staging = 'staging',
  Production = 'production',
}

export class EnvValidator {
  @IsEnum(NodeEnvEnum)
  NODE_ENV: NodeEnvEnum;

  @IsNotEmpty()
  @IsString()
  DATABASE_URL: string;

  @IsNotEmpty()
  @IsNumber()
  REDIS_EXPIRED: number;
}

export function validate(config: Record<string, unknown>) {
  const validatedConfig = plainToClass(EnvValidator, config, {
    enableImplicitConversion: true,
  });

  const errors = validateSync(validatedConfig, {
    skipMissingProperties: false,
  });

  if (errors.length > 0) {
    throw new Error(errors.toString());
  }
  return validatedConfig;
}

ConfigModuleに設定

app.module.tsのConfigModuleに設定することで、起動時にバリデートするようにします。

import { validate } from './env.validation';

@Module({
  imports: [
    ConfigModule.forRoot({
      validate,
    }),
  ],
})
export class AppModule {}

Summary

複数人開発時に環境変数が追加された時で、共有漏れがあったときは、起動時にエラーが表示されるので原因追及する時間が減って良いと思います。

公式はより詳しく書いてあるのでぜひ一読ください。

シェア!

この記事を書いた人

kenichiのアバター kenichi エンジニア・写真家 | Engineer and photographer

日本全国と海外を旅するノマドワーカー。5年間、技術営業として働いたのち独立。
フリーランスエンジニアとしてWebサイト制作やアプリケーション開発を行う。面白い人たちの面白いを世に届けるべく行動中。
2024年11月にポルトガルへ移住🇵🇹

目次