← NestJS コース
11. ValidationPipe — 入力の自動検証
ValidationPipe は、DTO に書いた検証ルールを自動で実行する仕組みです。class-validator の @IsString() や @Min() などのデコレータを DTO のプロパティに付け、main.ts で app.useGlobalPipes(new ValidationPipe()) を設定すると、@Body() で受け取る値が届く前に検証されます。
実務では「不正な入力はハンドラに届く前に弾く」ためにほぼ必ず使います。検証に失敗すると NestJS が自動で 400 Bad Request を返すので、各ハンドラに if 文の検証コードを書く必要がなくなります。
よくあるつまずきは、ValidationPipe の設定を忘れて DTO のデコレータが何も効いていないケースです。また whitelist: true オプションを付けると DTO に定義していない余分なプロパティを自動で取り除けるので、実務ではセットで有効化するのが定番です。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { Body, Controller, Post } from "@nestjs/common";
import { IsString, IsInt, Min } from "class-validator";
export class CreateUserDto {
@IsString()
name: string;
@IsInt()
@Min(0)
age: number;
}
// main.ts 側:
// app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
@Controller("users")
export class UsersController {
@Post() // 検証に失敗すると自動で 400 が返る
create(@Body() dto: CreateUserDto) {
return dto;
}
}