NestJS의 클래스 유효성 검사기 및 클래스 변환기와 zod 비교
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!