ホームページ >ウェブフロントエンド >jsチュートリアル >zod vs クラスバリデーターとクラストランスフォーマー

zod vs クラスバリデーターとクラストランスフォーマー

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 11:42:18794ブラウズ

zod vs class-validator & class-transformer

NestJS のクラスバリデーターおよびクラストランスフォーマーと zod の比較

私は zod と class-validator と class-transformer のどちらを選択するか混乱していました、または少なくとも興味がありました
NestJS の検証ライブラリとして。

要点

そのまま進んでください。

1. クラスバリデーターとクラストランスフォーマーを選択する理由

  • NestJS で一般的かつ広く使用されている デュオ
  • パッケージです。
  • 記述方法は、デコレータベースの検証であるため、非常にNestJSです。
  • クラストランスフォーマーと ValidationPipe を使用したクリーンでシームレスな統合

2. ゾッドを選んだ理由

  • フレームワークに依存しない
  • 非常にタイプスクリプト
  • 関数型スキーマベースのアプローチを好む人向け
  • パフォーマンスと軽量の検証が重要です

詳細

class-validator と class-transformer は、NestJS の検証として最もよく使用される 2 つのパッケージです。
はい、記述方法は decorator-based,
を使用する NestJS と同じです。 また、DTO として ValidationPipe で使用できるため、クリーンでシームレスであるためです。

したがって、コントローラーが受信した受信データ/ペイロードは、その定義に従って検証され、変更/変換されています。
一方、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
    }
}

結論

個人的にはゾッドの使い方の方が好きです。
ただし、強調する必要があるのは、チームのニーズと基準に従って選択するということです。

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

以上がzod vs クラスバリデーターとクラストランスフォーマーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。