NestJS × class-validatorを使って、controllerで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を設定しグローバル適用 |
この仕組みを取り入れることで、入力値の検証を自動化し、開発効率と品質を高めることができます。
articleNestJS × TypeORM vs Prisma vs Drizzle:DX・性能・移行性の総合ベンチ
articleNestJS メモリリーク診断:Node.js Profiler と Heap Snapshot で原因を掴む
articleNestJS 2025 年の全体像:Express・Fastify・Serverless の使い分け早わかり
articleNestJS 監視運用:SLI/SLO とダッシュボード設計(Prometheus/Grafana/Loki)
articleNestJS クリーンアーキテクチャ:UseCase/Domain/Adapter を疎結合に保つ設計術
articleNestJS Decorator 速見表:Controller/Param/Custom Decorator の定型パターン
articleReact クリーンアーキテクチャ実践:UI・アプリ・ドメイン・データの責務分離
articleWebLLM vs サーバー推論 徹底比較:レイテンシ・コスト・スケールの実測レポート
articleVitest モック技術比較:MSW / `vi.mock` / 手動スタブ — API テストの最適解はどれ?
articlePython ORMs 実力検証:SQLAlchemy vs Tortoise vs Beanie の選び方
articleVite で Web Worker / SharedWorker を TypeScript でバンドルする初期設定
articlePrisma Accelerate と PgBouncer を比較:サーバレス時代の接続戦略ベンチ
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来