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، أو 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

تدرّب بنفسك: Playground لـ Express