Menu
CoddyTech

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 קורא כללים שנכתבים באמצעות דקורטורים, ודקורטורים זקוקים למחלקה. זה הנושא של השיעור הבא.

challenge icon

אתגר

קל

לקוחות יכולים עכשיו ליצור משימה שכבר הושלמה. תארו את גוף הבקשה של POST /tasks באמצעות DTO, מחלקה שמפרטת את השדות שגוף הבקשה מכיל, והעבירו אותו עד לשירות.

  1. ב-src/tasks/dto/create-task.dto.ts, הוסיפו למחלקה CreateTaskDto שני שדות: title, מחרוזת, ו-done, ערך בוליאני אופציונלי.
  2. ב-src/tasks/tasks.controller.ts, שנו את המתודה create. הפרמטר שלה שמסומן ב-@Body() מקבל עכשיו את הטיפוס CreateTaskDto במקום { title: string }. העבירו לשירות את כל אובייקט ה-DTO, ולא רק את הכותרת.
  3. ב-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 {}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה TypeScript ו-NestJS

תרגלו בעצמכם: Express אונליין