# NestJSでDTO(データ転送用オブジェクト)を使用しCRUD操作を行ってみる
Table of Contents
検証ライブラリーをインストール
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;}上記でフィールドのデータ型が 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指定のisActiveをstringで送ったらfalseで登録された。
ついでにstring指定の箇所にnumberを送ったらそのままnumberで登録された。
つまりclass-validatorが動いてない。
これは別で調査する。