Aufgaben erstellen
Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 6 von 24.
Ein Client, der eine Aufgabe erstellt, sendet sie als JSON im Request-Body und benötigt anschließend die gespeicherte Aufgabe zurück.
@Post()
create(@Body() review: { stars: number }) {
this.reviews.push(review);
return review;
}@Post() ordnet POST auf dem Pfad des Controllers der Methode zu, und @Body() übergibt ihr das geparste JSON. Nest liest JSON-Bodies selbstständig ein, daher muss kein express.json() hinzugefügt werden.
Nest antwortet auf einen POST mit 201 Created, dem Status, der besagt, dass eine neue Ressource existiert, und auf jede andere Methode mit 200. @HttpCode(200) an der Methode würde das ändern; bei einer Erstellung lässt du es so.
Aufgabe
EinfachClients müssen Aufgaben hinzufügen können, nicht nur lesen. Füge eine Route hinzu, die aus dem vom Client gesendeten JSON eine Aufgabe erstellt.
- Füge in
src/tasks/tasks.controller.tseine Methode zuTasksControllerhinzu (nenne siecreate) fürPOST /tasks. Markiere sie mit@Post()und lies den JSON-Body mit@Body()in ihrem Parameter aus. Beide stammen aus@nestjs/common. - Erstelle die neue Aufgabe anhand des
titleim Body. Gib ihr eineid, die keine andere Aufgabe hat: eine Zahl größer als die höchste id inthis.tasks. Eine neue Aufgabe ist nie erledigt, also istdonefalse. - Füge die Aufgabe zu
this.taskshinzu, damitGET /tasksundGET /tasks/:idsie später finden. Gib die neue Aufgabe zurück. - Lege den Status nicht selbst fest. Nest antwortet auf einen POST selbst mit 201 Created.
Probiere es aus: Wähle POST, den Pfad /tasks und den Body { "title": "Buy milk" }. Du erhältst 201 und:
{ "id": 4, "title": "Buy milk", "done": false }Sende GET /tasks/4: dieselbe Aufgabe. Sende dann einen POST mit einem leeren Body, {}. Der Body wird noch nicht überprüft, also erhältst du weiterhin 201, mit einer Aufgabe ohne Titel: { "id": 5, "done": false }. Das Kapitel „Validierung“ behebt das.
Probier es selbst
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));
}
}
Alle Lektionen in TypeScript und NestJS
1Nest-Grundlagen
Klassen und MethodenHallo, NestEinen Controller registrieren4Guards, Filter und Interceptors
GuardsÜbe selbstständig: Express-Playground