DTOs
חלק מהיחידה TypeScript ו-NestJS במסלול ה-Node.js של Coddy. שיעור 13 מתוך 24.
@Body() body: { title: string } מתאר את גוף הבקשה במקום אחד בלבד, ושום דבר לא בודק אותו: { "title": 42 } עובר ללא בדיקה. DTO, אובייקט להעברת נתונים, הוא מחלקה שמתארת מה מכיל גוף הבקשה.
export class CreateOrderDto {
customer: string;
express?: boolean;
}
@Post()
create(@Body() dto: CreateOrderDto) {
return this.ordersService.create(dto);
}express? מסמן שדה אופציונלי. הבקר והשירות משתמשים באותה מחלקה, ולכן הם מסכימים על המבנה.
יש סיבה לכך ש-DTO הוא מחלקה ולא ממשק. ממשקים מוסרים יחד עם שאר הטיפוסים כשהקוד רץ, בעוד שמחלקה עדיין קיימת. מנגנון האימות של Nest קורא כללים שנכתבים באמצעות דקורטורים, ודקורטורים זקוקים למחלקה. זה הנושא של השיעור הבא.
אתגר
קללקוחות יכולים עכשיו ליצור משימה שכבר הושלמה. תארו את גוף הבקשה של POST /tasks באמצעות DTO, מחלקה שמפרטת את השדות שגוף הבקשה מכיל, והעבירו אותו עד לשירות.
- ב-
src/tasks/dto/create-task.dto.ts, הוסיפו למחלקהCreateTaskDtoשני שדות:title, מחרוזת, ו-done, ערך בוליאני אופציונלי. - ב-
src/tasks/tasks.controller.ts, שנו את המתודהcreate. הפרמטר שלה שמסומן ב-@Body()מקבל עכשיו את הטיפוסCreateTaskDtoבמקום{ title: string }. העבירו לשירות את כל אובייקט ה-DTO, ולא רק את הכותרת. - ב-
src/tasks/tasks.service.ts, שנו אתcreateכך שתקבל את ה-DTO במקום כותרת. המשימה החדשה מקבלת אתtitleשלה מה-DTO, וגם אתdoneשלה מה-DTO, או אתfalseכאשר אין בגוף הבקשהdone. המזהה ו-createdAtפועלים כבעבר.
נסו זאת: שלחו POST עם { "title": "Pay rent", "done": true } אל /tasks. תקבלו 201 ואת המשימה החדשה, כשהיא הושלמה:
{ "id": 4, "title": "Pay rent", "done": true, "createdAt": "2026-10-30T09:15:00.000Z" }(createdAt מציג את זמן הבקשה שלכם.) שלחו POST עם { "title": "Buy milk" }: תקבלו 201 עם "done": false. לאחר מכן שלחו POST עם { "title": 42 }. עדיין תקבלו 201, ו-"title": 42 יישמר: ה-DTO מתאר את גוף הבקשה, אבל עדיין לא בודק שום דבר. בשיעור הבא Nest יסרב לקבל אותו.
נסו בעצמכם
// תארו את גוף הבקשה של POST /tasks: כותרת, ואת done כאשר הלקוח שולח אותו.
export class CreateTaskDto {}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה TypeScript ו-NestJS
תרגלו בעצמכם: Express אונליין