Menu
CoddyTech

Routenparameter

Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 4 von 24.

Ein Client benötigt oft eine einzelne Aufgabe und nicht die ganze Liste. Ein Pfad kann einen Parameter enthalten: einen Teil, der sich von Anfrage zu Anfrage ändert.

@Get(':isbn')
findOne(@Param('isbn') isbn: string) {
    return this.books.find((book) => book.isbn === isbn);
}

:isbn entspricht jedem Wert an dieser Stelle im Pfad, sodass GET /books/978 diese Methode aufruft. @Param('isbn') übergibt diesen Wert an die Methode. Er ist immer Text: /books/42 liefert die Zeichenfolge '42', niemals die Zahl 42.

Lässt du den Namen weg, liefert @Param() das Objekt mit allen Parametern, { isbn: '978' }, statt des Werts.

challenge icon

Aufgabe

Einfach

Ein Client möchte oft eine einzelne Aufgabe und nicht die ganze Liste. Füge eine Route hinzu, die eine Aufgabe anhand ihrer ID zurückgibt.

  1. Füge in src/tasks/tasks.controller.ts eine zweite Methode zu TasksController hinzu (nenne sie findOne) für GET /tasks/:id. :id steht für einen beliebigen Wert an dieser Stelle des Pfads, sodass /tasks/2 diese Route erreicht.
  2. Lies die ID mit @Param('id') aus dem Pfad aus. Importiere Param aus @nestjs/common.
  3. Die ID kommt als Text an, etwa wie "2", aber die IDs in this.tasks sind Zahlen, und "2" === 2 ist false. Wandle die ID in eine Zahl um, bevor du sie vergleichst.
  4. Gib die Aufgabe mit dieser ID zurück.
  5. Lass GET /tasks unverändert: Es gibt weiterhin die ganze Liste zurück.

Probiere es aus: Sende GET /tasks/2. Du erhältst 200 und:

{ "id": 2, "title": "Fix the login bug", "done": false }

Sende auch GET /tasks/1 und GET /tasks/3. Sende dann GET /tasks/99. Keine Aufgabe hat diese ID, daher gibt deine Methode nichts zurück, und Nest antwortet mit 200 und einem leeren Body. Das ist vorerst erwartungsgemäß. Der Client erhält dadurch keine Information, und eine spätere Lektion behebt das.

Probier es selbst

import { Controller, Get } 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(): Task[] {
        return this.tasks;
    }
}

Alle Lektionen in TypeScript und NestJS

Übe selbstständig: Express-Playground