.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
複数人開発時に環境変数が追加された時で、共有漏れがあったときは、起動時にエラーが表示されるので原因追及する時間が減って良いと思います。
公式はより詳しく書いてあるのでぜひ一読ください。
Documentation | NestJS – A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines ele…