ホームページ >ウェブフロントエンド >jsチュートリアル >zod vs クラスバリデーターとクラストランスフォーマー
NestJS のクラスバリデーターおよびクラストランスフォーマーと zod の比較
私は zod と class-validator と class-transformer のどちらを選択するか混乱していました、または少なくとも興味がありました
NestJS の検証ライブラリとして。
そのまま進んでください。
class-validator と class-transformer は、NestJS の検証として最もよく使用される 2 つのパッケージです。
はい、記述方法は decorator-based,
を使用する NestJS と同じです。
また、DTO として ValidationPipe で使用できるため、クリーンでシームレスであるためです。
したがって、コントローラーが受信した受信データ/ペイロードは、その定義に従って検証され、変更/変換されています。
一方、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 } }
個人的にはゾッドの使い方の方が好きです。
ただし、強調する必要があるのは、チームのニーズと基準に従って選択するということです。
https://abdulghofurme.github.io/posts/zod-vs-class-validator-n-class-transformer/
以上がzod vs クラスバリデーターとクラストランスフォーマーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。