NestJSでclass-validatorを使いcontrallerでdtoを適応するやり方を紹介

NestJSでDTOクラスバリデーションを使い、コントローラーの手前で適用する方法について、わかりやすくご紹介いたします。
DTOとクラスバリデーションによるリクエストの安全確保
NestJSでは、DTO(Data Transfer Object)とclass-validator
パッケージを組み合わせることで、外部からのリクエストデータを強力かつ柔軟にバリデーションできます。
これにより、予期しないデータの受け取りを防ぎ、バグの少ない堅牢なAPI設計が可能になります。
必要なパッケージのインストール
まずはバリデーションに必要なパッケージをyarn
で導入いたします。
bashyarn add class-validator class-transformer
DTOの作成とバリデーションルールの定義
以下のように、DTOクラスを作成し、class-validator
のデコレーターを使ってバリデーションルールを定義いたします。
ts// src/user/dto/create-user.dto.ts
import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
export class CreateUserDto {
@IsEmail()
email: string;
@IsNotEmpty()
@MinLength(6)
password: string;
}
コントローラーでDTOを利用する
次に、作成したDTOをコントローラーの@Body()
と組み合わせて使用いたします。
ts// src/user/user.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
@Controller('users')
export class UserController {
@Post()
async create(@Body() createUserDto: CreateUserDto) {
// createUserDto はバリデーション済み
return `ユーザー登録:${createUserDto.email}`;
}
}
グローバルパイプでのバリデーション設定
NestJSでは、DTOのバリデーションをコントローラーで明示的に書く必要はありません。グローバルでValidationPipe
を設定すれば、すべてのDTOに自動的に適用されます。
main.ts
ファイルに以下の設定を追加いたします。
ts// src/main.ts
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, // DTOに存在しないプロパティは除外
forbidNonWhitelisted: true, // 許可されていないプロパティがあるとエラー
transform: true, // 型変換を有効化
}),
);
await app.listen(3000);
}
bootstrap();
バリデーションエラーの例
リクエストで以下のようなJSONを送信したとき:
json{
"email": "invalid-email",
"password": "123"
}
バリデーションエラーが以下のように返されます:
json{
"statusCode": 400,
"message": [
"email must be an email",
"password must be longer than or equal to 6 characters"
],
"error": "Bad Request"
}
まとめ
NestJSでDTOを使ったバリデーションを行うには、以下のステップを踏むことで、安全かつ堅牢なAPIを構築することができます。
ステップ | 内容 |
---|---|
1 | class-validator とclass-transformer を導入 |
2 | DTOクラスにデコレーターでルールを定義 |
3 | コントローラーでDTOを使用 |
4 | main.ts にValidationPipe を設定しグローバル適用 |
この仕組みを取り入れることで、入力値の検証を自動化し、開発効率と品質を高めることができます。
記事Article
もっと見る- article
NestJSでバリデーションエラーをログ出力する設定を紹介
- article
NestJSで作成したAPIのレスポンスヘッダーに付与されるx-powered-by: Express を消す方法を紹介
- article
Next.jsで環境変数に別の変数を利用し柔軟に管理するdotenv-expandの活用法を紹介
- article
【2025年3月版】Cursor ProとAPI利用比較。 Claude・GPT-4o・o1・GPT-4.5の損益分岐点と選び方
- article
フォーム入力情報からZodを利用してDTO作成しへ変換処理を実施するやり方を紹介
- article
Zodバリデーションのエラーメッセージを日本語化すやり方を紹介