דלג לתוכן הראשי

אסטרטגיית אימות ו-DTOs

אנו משתמשים ב-Zod בשילוב עם nestjs-zod עבור כל אובייקטי העברת הנתונים (DTOs) ואימות זמן ריצה. אנו נמנעים מפורשות משימוש ב-class-validator כדי להבטיח בטיחות טיפוסים קפדנית והגדרות סכמה נקיות יותר.

הדפוס

  1. הגדרת סכמה: צור סכמת Zod המגדירה את המבנה והכללים.
  2. יצירת מחלקה: הרחב את createZodDto(Schema) ליצירת מחלקה תואמת NestJS.
  3. שימוש בקונטרולר: השתמש במחלקה כסוג במתודת הקונטרולר. ה-ValidationPipe הטיפוסי מוחלף/משופר על ידי ZodValidationPipe (רשום גלובלית או מקומית).

דוגמה

src/users/dto/create-user.dto.ts

import { createZodDto } from 'nestjs-zod';
import { z } from 'zod';

// 1. הגדרת סכמת Zod
export const CreateUserSchema = z.object({
name: z.string().min(2, 'Name is too short').max(50),
email: z.string().email(),
password: z.string().min(6),
// Enums תואמים ל-Prisma enums
role: z.enum(['User', 'Admin']).default('User'),
// שדות אופציונליים
synagogueCode: z.string().optional(),
});

// 2. ייצוא מחלקת DTO
export class CreateUserDto extends createZodDto(CreateUserSchema) {}

הגדרה גלובלית

ה-Validation Pipe מופעל ב-main.ts:

import { ZodValidationPipe } from 'nestjs-zod';

app.useGlobalPipes(new ZodValidationPipe());

אינטגרציה עם Swagger

nestjs-zod מייצר אוטומטית סכמות Swagger (OpenAPI) מהגדרות ה-Zod. בדרך כלל אין צורך להוסיף דקורטורים של @ApiProperty() באופן ידני אלא אם כן צריך לעקוף את התיאור או הדוגמה.

// Swagger מציג את 'name' כמחרוזת, נדרש, מינימום 2 תווים אוטומטית.

שיטות עבודה מומלצות

  • מצב קפדני: סכמות Zod הן קפדניות כברירת מחדל (מסירות מפתחות לא ידועים).
  • טרנספורמציה: השתמש ב-.transform() בזהירות מכיוון שהוא רץ במהלך האימות.
  • שימוש חוזר: ייצא סכמות נפוצות (למשל, MongoIdSchema) ב-src/common/validation.