DTOs
CoddyのNode.jsジャーニー「TypeScriptとNestJS」セクションの一部。レッスン 10/17。
@Body() body: { title: string }はリクエストボディを一か所で記述するだけで、何も検証しません。{ "title": 42 }はそのまま通過します。データ転送オブジェクトであるDTOは、リクエストボディに何が含まれるかを記述するクラスです。
export class CreateOrderDto {
customer: string;
express?: boolean;
}
@Post()
create(@Body() dto: CreateOrderDto) {
return this.ordersService.create(dto);
}express?は任意のフィールドであることを示します。コントローラーとサービスはこのクラスを共有するため、構造について共通の認識を持てます。
DTOがインターフェースではなくクラスであるのには理由があります。コードの実行時には、インターフェースはほかの型とともに取り除かれますが、クラスはそのまま存在します。また、実行時にリクエストボディを検証できるのは、クラスに付けられたclass-validatorのデコレーターだけです。次のレッスンで説明します。
チャレンジ
簡単dto/create-task.dto.tsでCreateTaskDtoを定義します。titleと、任意のdoneを指定します。POST /tasksのリクエストボディにこれを使います。新しいタスクでは、ボディにdoneが含まれていない場合はfalseになります。{ "title": "Pay rent", "done": true }を指定してPOST /tasksを送信し、次に{ "title": 42 }を指定して送信します。
自分で試してみよう
// POST /tasks のリクエストボディを記述する: title と、クライアントが送信した場合は done。
export class CreateTaskDto {}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。