T-CREATOR

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

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を構築することができます。

ステップ内容
1class-validatorclass-transformerを導入
2DTOクラスにデコレーターでルールを定義
3コントローラーでDTOを使用
4main.tsValidationPipeを設定しグローバル適用

この仕組みを取り入れることで、入力値の検証を自動化し、開発効率と品質を高めることができます。

記事Article

もっと見る