【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

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

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

よかったらシェアしてね!
目次