首頁 >web前端 >js教程 >zod 與類別驗證器和類別轉換器

zod 與類別驗證器和類別轉換器

Patricia Arquette
Patricia Arquette原創
2024-12-19 11:42:18781瀏覽

zod vs class-validator & class-transformer

zod 與 NestJS 中的類別驗證器和類別轉換器的比較

我很困惑,或者至少對 zod 或類驗證器和類轉換器感到好奇
作為 NestJS 中的驗證庫。

重點

直接去吧。

1. 選擇class-validator和class-transformer的理由

  • 是 NestJS 中常見且廣泛使用的 duo 套件
  • 寫法很NestJS因為它是基於裝飾器的驗證
  • 與類轉換器和 ValidationPipe 的使用進行乾淨且無縫的集成

2、選擇Zod的理由

  • 與框架無關
  • 很打字稿
  • 對於喜歡功能性基於模式方法
  • 的人
  • 性能和輕量級驗證至關重要

細節

class-validator 和 class-transformer 是 NestJS 中最常用作驗證的 2 個包,
是的,除了寫法和NestJS一樣,使用基於裝飾器的
也因為它乾淨且無縫,因為它可以與 ValidationPipe 一起用作 DTO.

因此控制器接收到的傳入資料/有效負載已根據其定義進行了驗證和更改/轉換。
同時,Zod 仍需要手動驗證收到的資料/有效負載,
是的,也許只有 1 行或最多 3 行,
但當然,需要的驗證功能越多,需要的手動流程就越多。

程序詳情

以下是詳細流程(可能主觀)供比較。

類別驗證器和類別轉換器

1. 安裝

npm install class-validator class-transformer

2.啟用全域驗證

// main.ts
....
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
....
  // Enable validation globally
  app.useGlobalPipes(new ValidationPipe({
    transform: true, // Automatically transform payloads to DTO instances
    whitelist: true, // Strip unknown properties
    forbidNonWhitelisted: true, // Throw error for unknown properties
  }));
....
}
....

3.定義DTO(資料傳輸物件)

import { IsNotEmpty, IsString, IsInt, Min } from "class-validator";
import { Type, Transform } from "class-transformer";

export class CreateUserDto {
    @Transform(({ value }) => value.trim()) // Trim whitespaces
    @IsNotEmpty({ message: "Nama tidak boleh kosong" })
    @IsString({ message: "Nama harus berupa string" })
    @Min(3, { message: "Minimal panjang nama 3 karakter" })
    name: string;

    @Type(() => Number) // Transform input ke tipe Number
    @IsNotEmpty({ message: "Nama tidak boleh kosong" })
    @IsInt({ message: "Umur harus berupa bilangan bulat" })
    @Min(17, { message: "Minimal umur terdaftar 17 tahun" })
    age: number;
}

很長,但就是這樣基於裝飾器

4. 驗證的使用

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

@Controller("users")
export class UsersController {
    @Post()
    create(@Body() createUserDto: CreateUserDto) {
        // Pada titik ini data/payload createUserdDto
        // sudah tervalidasi & diubah sesuai definisinya
        // developer bisa langsung eksekusi service
        // atau logic yang lain
    }
}

佐德

1. 安裝

npm install zod

2. 建立驗證方案

// user.validaiton.ts
import { z, ZodType } from "zod";

export class UserValidation {
    static readonly CREATE: ZodType = z.object({
        name: z
            .string({ message: "Nama harus berupa string" })
            .nonempty({ message: "Nama tidak boleh kosong" })
            .min(3, "Minimal panjang nama 13 karakter"),
        age: z
            .number({ message: "Umur harus berupa angka" })
            .int({ message: "Umur harus berupa bilangan bulat" })
            .min(17, "Minimal umur terdaftar 17 tahub"),
    });
}

export type TCreateUserPayload = z.infer<typeof UserValidation.CREATE>;

*個人:與上面的相比,我更喜歡閱讀此架構

3. 驗證的使用

import { Body, Controller, Post } from "@nestjs/common";
import { UserValidation, TCreateUserPayload } from "./user.validation.ts";

@Controller("users")
export class UsersController {
    @Post()
    create(@Body() createUserPayload: TCreateUserPayload) {
        const payload = UserValidation.CREATE.parse(createUserPayload);
        // Pada titik ini data/payload payload
        // sudah tervalidasi & diubah sesuai definisinya
        // developer bisa langsung eksekusi service
        // atau logic yang lain
    }
}

結論

我個人比較喜歡Zod的使用方式。
不過要強調的是根據團隊的需求和標準來選擇

https://abdulghofurme.github.io/posts/zod-vs-class-validator-n-class-transformer/

以上是zod 與類別驗證器和類別轉換器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn