Skip to main content

Data Transfer Object

DTO (Data Transfer Object) 是 NestJS 中用來定義如何通過網路傳輸資料的一種方式。在 NestJS 中,DTO 是一種設計模式,主要用於將資料從一個層傳遞到另一個層,或者是在網路上進行資料傳輸。它是一個純粹的 JavaScript 物件,可以使用類別、介面或者是簡單的 JavaScript 物件來定義。

🌟 DTO 的主要目的是提供一種可預測的資料結構,使得開發者可以清楚知道在請求和響應中將會接收和發送什麼樣的資料。它可以幫助我們進行資料驗證,確保資料的正確性,並且提高程式碼的可讀性和可維護性。

在 NestJS 中,我們通常會使用裝飾器和類別驗證器來定義和驗證 DTO。例如,我們可以使用 @IsString() 來驗證一個欄位是不是字串,或者使用 @IsNotEmpty() 來驗證一個欄位是否為空。

總的來說,DTO 是一種在 NestJS 中處理資料傳輸的重要工具,它可以幫助我們確保資料的一致性,並提高程式碼的可讀性和可維護性。

在 Nest.js 中,DTO(Data Transfer Object)是用於定義如何通過網絡傳輸數據的物件。DTO 通常會用於定義請求體的結構。以下是一個 Nest.js DTO 的範例:

首先,我們先建立一個 DTO:

import { IsString, IsInt } from "class-validator";

export class CreateCatDto {
@IsString()
name: string;

@IsInt()
age: number;

@IsString()
breed: string;
}

在上述的程式碼中,我們定義了一個 CreateCatDto 的 class,並且使用 class-validator 的裝飾器(Decorator)來設定驗證規則。

接著,我們可以在 Controller 中使用這個 DTO:

import { Body, Controller, Post } from "@nestjs/common";
import { CreateCatDto } from "./dto/create-cat.dto";

@Controller("cats")
export class CatsController {
@Post()
async create(@Body() createCatDto: CreateCatDto) {
// ...
}
}

create 方法中,我們使用 @Body() 裝飾器來取得傳入的資料,並且指定其型別為 CreateCatDto。這樣 NestJS 就會自動將傳入的資料轉換為 CreateCatDto 的實例,並且進行驗證。

如果驗證失敗,NestJS 會拋出一個 HttpException,並且回傳 400 Bad Request 的 HTTP 狀態碼。你也可以透過攔截器(Interceptor)或過濾器(Filter)來自訂錯誤的處理方式。

我們也可以套件來幫助

npm i -S class-validator
npm i -S class-transformer

建立一個 pipe

import { ArgumentMetadata, HttpException, HttpStatus, Injectable, PipeTransform } from "@nestjs/common";
import { plainToInstance } from "class-transformer";
import { validate } from "class-validator";

@Injectable()
export class TestPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
console.log(value, metadata);
const DTO = plainToInstance(metadata.metatype, value);
console.log(DTO);

const errors = await validate(DTO);
console.log("打印***errors", errors);

if (errors.length) {
throw new HttpException(errors, HttpStatus.BAD_REQUEST);
}

return value;
}
}

在 controller 中引用

@Post('/test')
getTest(@Body(TestPipe) payload: PayloadDto) {
console.log(payload);
return this.service.getTest();
}

檢查流程

如果有 error 所產出來的 msg

這樣寫的好處是:

  1. 提高代碼的可讀性:其他開發人員可以很容易地了解每個 API 接口的請求體結構。
  2. 提高代碼的可維護性:如果後續需要修改請求體的結構,只需要在一個地方修改即可。
  3. 提高代碼的健壯性:使用 class-validator 可以在運行時對請求體進行驗證,防止不合法的數據進入我們的應用程式。

NestJS 之 12- 数据传输对象 DTO - 掘金