zod 與 NestJS 中的類別驗證器和類別轉換器的比較
我很困惑,或者至少對 zod 或類驗證器和類轉換器感到好奇
作為 NestJS 中的驗證庫。
直接去吧。
class-validator 和 class-transformer 是 NestJS 中最常用作驗證的 2 個包,
是的,除了寫法和NestJS一樣,使用基於裝飾器的,
也因為它乾淨且無縫,因為它可以與 ValidationPipe 一起用作 DTO.
因此控制器接收到的傳入資料/有效負載已根據其定義進行了驗證和更改/轉換。
同時,Zod 仍需要手動驗證收到的資料/有效負載,
是的,也許只有 1 行或最多 3 行,
但當然,需要的驗證功能越多,需要的手動流程就越多。
以下是詳細流程(可能主觀)供比較。
npm install class-validator class-transformer
// 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 })); .... } ....
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; }
很長,但就是這樣基於裝飾器。
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 } }
npm install zod
// 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>;
*個人:與上面的相比,我更喜歡閱讀此架構
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中文網其他相關文章!