検証ライブラリーをインストール
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/dto
にcreate-sample.dto.ts
を作成する。ファイルの内容は下記の通り。
import { IsBoolean, IsString } from 'class-validator';
export class CreateSampleDTO {
@IsString()
firstName: string;
@IsString()
lastName: string;
@IsBoolean()
isActive: boolean;
}
上記でフィールドのデータ型が string
orboolean
型であるかを確認している。
それぞれのファイルに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
指定のisActive
をstring
で送ったらfalse
で登録された。
ついでにstring
指定の箇所にnumber
を送ったらそのままnumber
で登録された。
つまりclass-validator
が動いてない。
これは別で調査する。