# 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/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が動いてない。

これは別で調査する。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments