אסטרטגיית אימות ו-DTOs
אנו משתמשים ב-Zod בשילוב עם nestjs-zod עבור כל אובייקטי העברת הנתונים (DTOs) ואימות זמן ריצה.
אנו נמנעים מפורשות משימוש ב-class-validator כדי להבטיח בטיחות טיפוסים קפדנית והגדרות סכמה נקיות יותר.
הדפוס
- הגדרת סכמה: צור סכמת Zod המגדירה את המבנה והכללים.
- יצירת מחלקה: הרחב את
createZodDto(Schema)ליצירת מחלקה תואמת NestJS. - שימוש בקונטרולר: השתמש במחלקה כסוג במתודת הקונטרולר. ה-
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.