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.
Wyzwanie
ŁatwyKlienci muszą dodawać zadania, a nie tylko je odczytywać. Dodaj trasę, która tworzy zadanie na podstawie JSON-a wysłanego przez klienta.
- W
src/tasks/tasks.controller.tsdodaj doTasksControllermetodę (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. - Utwórz nowe zadanie na podstawie właściwości
titlez treści żądania. Nadaj muid, którego nie ma żadne inne zadanie: o jeden większe niż największe id wthis.tasks. Nowe zadanie nigdy nie jest ukończone, więcdonema wartośćfalse. - Dodaj zadanie do
this.tasks, aby później można je było znaleźć za pomocąGET /tasksiGET /tasks/:id. Zwróć nowe zadanie. - 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
1Podstawy Nest
Klasy i metodyWitaj, NestRejestrowanie kontrolera4Strażnicy, filtry i interceptory
StrażnicyPoćwicz samodzielnie: Edytor online Express