検証ライブラリーをインストール

npm install class-validator --save

これは、見出しの通りPOST時に検証してくるライブラリー。

デコレータおよび非デコレータ ベースの検証の使用を許可します。内部的には、 validator.jsを使用して検証を実行します。Class-validator は、ブラウザと node.js プラットフォームの両方で動作します。

ちなみにバージョンは"class-validator": "^0.14.0"←の通り。

データ転送オブジェクトを作成する

データ転送オブジェクト (DTO)とは

アプリケーションで受信するデータ用に適切なデータ構造を作成、検証しやすくするもの。 DTO を使うことで、リクエスト本文から抽出されるオブジェクトの形状を指定でき、検証の組み込みが容易になるとのこと。

ちなみにDTOは英語名(Data Transfer Object)と日本語読みの略が一致した稀有な例。

DTO をセットアップする

src/sample/dtocreate-sample.dto.tsを作成する。ファイルの内容は下記の通り。

import { IsBoolean, IsString } from 'class-validator';

export class CreateSampleDTO {
    @IsString()
    firstName: string;

    @IsString()
    lastName: string;

    @IsBoolean()
    isActive: boolean;
}

上記でフィールドのデータ型が stringorboolean型であるかを確認している。

それぞれのファイルにDTOを読み込む

ファイルのインポートは割愛する。

sample.controller.ts

  create() {
    return this.sService.createSample();
  }

↓に変更する。

  create(@Body() createSampleDTO: CreateSampleDTO): Promise<Sample> {
    return this.sService.createSample(createSampleDTO);
  }

sample.service.ts

  public async createSample(): Promise<Sample> {
    return await this.sampleRepository.save({
      firstName: 'first',
      lastName: 'last',
      isActive: true,
    });
  }

↓に変更する。

  async createSample(createSampleDTO: CreateSampleDTO): Promise<Sample> {
    return await this.sampleRepository.save({
      firstName: createSampleDTO.firstName,
      lastName: createSampleDTO.lastName,
      isActive: createSampleDTO.isActive,
    });
  }

実際にポストしてみる

$ curl -d '{"firstName":"taro", "lastName":"yamada", "isActive":true}' -H "Content-Type: application/json" -X POST http://localhost:3000/sample{"firstName":"taro","lastName":"yamada","isActive":true,"id":11}

データの作成ができていることを確認できた。

ちなみに

$ curl -d '{"firstName":"taro", "lastName":"yamada", "isActive":"string"}' -H "Content-Type: application/json" -X POST http://localhost:3000/sample{"firstName":"taro","lastName":"yamada","isActive":false,"id":12}

Boolean指定のisActivestringで送ったらfalseで登録された。

ついでにstring指定の箇所にnumberを送ったらそのままnumberで登録された。

つまりclass-validatorが動いてない。

これは別で調査する。