Menu
CoddyTech

إنشاء المهام

جزء من قسم TypeScript وNestJS في رحلة Node.js على Coddy. الدرس 6 من 24.

يرسل العميل الذي ينشئ مهمةً هذه المهمة بصيغة JSON في نص الطلب، ويحتاج إلى استلام المهمة المحفوظة.

@Post()
create(@Body() review: { stars: number }) {
    this.reviews.push(review);
    return review;
}

يربط @Post() طلب POST على مسار وحدة التحكم بالطريقة، ويمرّر @Body() إليها بيانات JSON التي جرى تحليلها. يقرأ Nest نصوص JSON للطلبات تلقائيًا، لذا لا حاجة إلى إضافة express.json().

يرد Nest على طلب POST بالحالة 201 Created، وهي الحالة التي تشير إلى وجود مورد جديد، وعلى كل طريقة أخرى بالحالة 200. يؤدي وضع @HttpCode(200) على الطريقة إلى تغيير ذلك؛ أما عند الإنشاء، فاتركها كما هي.

challenge icon

التحدي

سهل

يحتاج العملاء إلى إضافة المهام، لا قراءتها فحسب. أضف مسارًا ينشئ مهمة من JSON الذي يرسله العميل.

  1. في src/tasks/tasks.controller.ts، أضف طريقة إلى TasksController (سمّها create) من أجل POST /tasks. ضع عليها @Post()، واقرأ جسم JSON باستخدام @Body() على وسيطها. كلاهما من @nestjs/common.
  2. أنشئ المهمة الجديدة باستخدام title من الجسم. امنحها id غير مستخدم من قبل أي مهمة أخرى: واحدًا أكثر من أكبر معرّف في this.tasks. لا تكون المهمة الجديدة منجزة أبدًا، لذا تكون قيمة done هي false.
  3. أضف المهمة إلى this.tasks، كي يعثر عليها GET /tasks وGET /tasks/:id لاحقًا. أعد المهمة الجديدة.
  4. لا تعيّن الحالة بنفسك. يستجيب Nest لطلب POST بالحالة 201 Created تلقائيًا.

جرّب ذلك: اختر POST، والمسار /tasks، والجسم { "title": "Buy milk" }. ستحصل على 201 وعلى:

{ "id": 4, "title": "Buy milk", "done": false }

أرسل GET /tasks/4: ستحصل على المهمة نفسها. ثم أرسل POST بجسم فارغ، {}. لا يتحقق شيء من الجسم بعد، لذا ستظل تحصل على 201، مع مهمة ليس لها عنوان: { "id": 5, "done": false }. يعالج فصل التحقق ذلك.

جرّب بنفسك

import { Controller, Get, Param, Query } from '@nestjs/common';

interface Task {
    id: number;
    title: string;
    done: boolean;
}

@Controller('tasks')
export class TasksController {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true },
        { id: 2, title: 'Fix the login bug', done: false },
        { id: 3, title: 'Plan the sprint', done: false },
    ];

    @Get()
    findAll(@Query('done') done?: string): Task[] {
        if (done === undefined) {
            return this.tasks;
        }
        return this.tasks.filter((task) => task.done === (done === 'true'));
    }

    @Get(':id')
    findOne(@Param('id') id: string): Task | undefined {
        return this.tasks.find((task) => task.id === Number(id));
    }
}

جميع دروس TypeScript وNestJS

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