Menu
CoddyTech

Verschachtelte Routen

Teil des Abschnitts Express-Grundlagen der Node.js-Journey von Coddy. Lektion 20 von 23.

Rezensionen gehören zu einem Rezept, daher liegen ihre URLs darunter: /api/recipes/2/reviews.

const chapters = express.Router({ mergeParams: true });

chapters.get('/', (req, res) => {
    res.json(chaptersOf(req.params.isbn));
});

app.use('/api/books/:isbn/chapters', chapters);

req.params eines Routers enthält nur die Parameter seiner eigenen Pfade. Das :isbn im Mount-Pfad gehört zur App und ist daher innerhalb des Routers undefined, sofern der Router nicht mit mergeParams: true erstellt wurde.

routes/reviews.js ist bereit und enthält ein reviews-Objekt sowie einen hasRecipe(id)-Hilfsfunktion.

challenge icon

Aufgabe

Einfach

Besucher können Bewertungen zu einem Rezept hinterlassen. Eine Bewertung gehört zu einem Rezept, daher befindet sich ihre URL unter der URL dieses Rezepts: /api/recipes/1/reviews.

  1. Sorge in routes/reviews.js dafür, dass der Router die Rezept-ID aus dem Pfad lesen kann, unter dem er eingebunden ist. Andernfalls ist req.params.id im Router undefined (siehe Lektionstext).
  2. Füge eine GET-Route für / hinzu. Sie gibt die Bewertungen dieses Rezepts als JSON-Liste zurück oder, falls es noch keine gibt, eine leere Liste: []. Speichere die Bewertungen im Objekt reviews, mit einer Liste pro Rezept-ID, wie in { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Füge eine POST-Route für / hinzu. Sie liest stars und text aus dem Body, fügt die Bewertung zur Liste dieses Rezepts hinzu und antwortet mit dem Status 201 und der Bewertung: {"stars": 5, "text": "Lovely"}. Speichere und sende nur diese beiden Felder.
  4. Antworte in beiden Routen mit dem Status 404 und {"error": "No such recipe"}, wenn hasRecipe(id) false ist.
  5. Importiere den Router in server.js und binde ihn unter /api/recipes/:id/reviews ein, neben dem Rezepte-Router und vor dem 404-Handler.

Probiere es aus: Klicke auf „Ausführen“ und sende /api/recipes/1/reviews: []. Wähle POST und sende {"stars": 5, "text": "Lovely"} an /api/recipes/1/reviews: Status 201 und die Bewertung. Rufe erneut GET /api/recipes/1/reviews auf: [{"stars":5,"text":"Lovely"}]. Sende /api/recipes/2/reviews: weiterhin [], denn jedes Rezept hat seine eigenen Bewertungen. Sende /api/recipes/99/reviews: Status 404 und {"error":"No such recipe"}.

Probier es selbst

import express from 'express';
import { recipes } from '../data.js';

// Bewertungen nach Rezept-ID, zum Beispiel { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));

const router = express.Router();

// GET / listet die Bewertungen eines Rezepts auf. POST / fügt eine Bewertung hinzu.

export default router;

Alle Lektionen in Express-Grundlagen

Übe selbstständig: Express-Playground