Dev Study
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;
  }
}
公式ドキュメントで詳しく ↗