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، أو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
تدرّب بنفسك: Playground لـ Express