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

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