Menu
CoddyTech

Tworzenie zadań

Część sekcji TypeScript i NestJS ścieżki Node.js w Coddy. Lekcja 6 z 24.

Klient, który tworzy zadanie, wysyła je jako JSON w treści żądania i potrzebuje z powrotem zapisanego zadania.

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

@Post() mapuje POST na ścieżce kontrolera na metodę, a @Body() przekazuje jej sparsowany JSON. Nest sam odczytuje treści żądań w formacie JSON, więc nie trzeba dodawać express.json().

Nest odpowiada na żądanie POST kodem 201 Created, który oznacza, że istnieje nowy zasób, a na wszystkie pozostałe metody kodem 200. @HttpCode(200) w metodzie zmieniłoby ten kod; w przypadku tworzenia pozostaw go bez zmian.

challenge icon

Wyzwanie

Łatwy

Klienci muszą dodawać zadania, a nie tylko je odczytywać. Dodaj trasę, która tworzy zadanie na podstawie JSON-a wysłanego przez klienta.

  1. W src/tasks/tasks.controller.ts dodaj do TasksController metodę (nazwij ją create) obsługującą POST /tasks. Oznacz ją za pomocą @Post(), a treść żądania JSON odczytaj za pomocą @Body() w parametrze metody. Oba elementy pochodzą z @nestjs/common.
  2. Utwórz nowe zadanie na podstawie właściwości title z treści żądania. Nadaj mu id, którego nie ma żadne inne zadanie: o jeden większe niż największe id w this.tasks. Nowe zadanie nigdy nie jest ukończone, więc done ma wartość false.
  3. Dodaj zadanie do this.tasks, aby później można je było znaleźć za pomocą GET /tasks i GET /tasks/:id. Zwróć nowe zadanie.
  4. Nie ustawiaj samodzielnie statusu. Nest sam odpowiada na żądanie POST statusem 201 Created.

Wypróbuj: wybierz POST, ścieżkę /tasks i treść żądania { "title": "Buy milk" }. Otrzymasz status 201 i:

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

Wyślij GET /tasks/4: otrzymasz to samo zadanie. Następnie wyślij POST z pustą treścią żądania: {}. Na razie nic nie sprawdza treści żądania, więc nadal otrzymasz status 201, a zadanie nie będzie miało tytułu: { "id": 5, "done": false }. Rozdział o walidacji rozwiązuje ten problem.

Spróbuj swoich sił

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));
    }
}

Wszystkie lekcje w sekcji TypeScript i NestJS

Poćwicz samodzielnie: Edytor online Express