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.
Aufgabe
EinfachBesucher 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.
- Sorge in
routes/reviews.jsdafür, dass der Router die Rezept-ID aus dem Pfad lesen kann, unter dem er eingebunden ist. Andernfalls istreq.params.idim Routerundefined(siehe Lektionstext). - 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 Objektreviews, mit einer Liste pro Rezept-ID, wie in{ "1": [{ "stars": 5, "text": "Lovely" }] }. - Füge eine POST-Route für
/hinzu. Sie lieststarsundtextaus 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. - Antworte in beiden Routen mit dem Status 404 und
{"error": "No such recipe"}, wennhasRecipe(id)false ist. - Importiere den Router in
server.jsund binde ihn unter/api/recipes/:id/reviewsein, 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