Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Clients 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.

  1. Füge in src/tasks/tasks.controller.ts eine Methode zu TasksController hinzu (nenne sie create) für POST /tasks. Markiere sie mit @Post() und lies den JSON-Body mit @Body() in ihrem Parameter aus. Beide stammen aus @nestjs/common.
  2. Erstelle die neue Aufgabe anhand des title im Body. Gib ihr eine id, die keine andere Aufgabe hat: eine Zahl größer als die höchste id in this.tasks. Eine neue Aufgabe ist nie erledigt, also ist done false.
  3. Füge die Aufgabe zu this.tasks hinzu, damit GET /tasks und GET /tasks/:id sie später finden. Gib die neue Aufgabe zurück.
  4. 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

Übe selbstständig: Express-Playground