Routes imbriquées
Fait partie de la section Les bases d’Express du Journey Node.js de Coddy. Leçon 20 sur 23.
Les avis sont associés à une seule recette : leurs URL se trouvent donc sous celle-ci : /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);Un routeur ne contient dans req.params que les paramètres de ses propres chemins. Le :isbn du chemin de montage appartient à l’application ; il vaut donc undefined dans le routeur, sauf si celui-ci est créé avec mergeParams: true.
routes/reviews.js est prêt et contient un objet reviews ainsi qu’une fonction auxiliaire hasRecipe(id).
Défi
FacileLes visiteurs peuvent laisser des avis sur une recette. Un avis appartient à une seule recette, son URL se trouve donc sous cette recette : /api/recipes/1/reviews.
- Dans
routes/reviews.js, configure le routeur pour qu’il puisse lire l’identifiant de la recette dans le chemin auquel il est monté. Sans cela,req.params.idvautundefineddans le routeur (voir le texte de la leçon). - Ajoute une route GET pour
/. Elle renvoie les avis de cette recette sous forme de liste JSON, ou une liste vide,[], si elle n’en a pas encore. Garde les avis dans l’objetreviews, une liste par identifiant de recette, comme{ "1": [{ "stars": 5, "text": "Lovely" }] }. - Ajoute une route POST pour
/. Elle litstarsettextdans le corps de la requête, ajoute l’avis à la liste de cette recette et répond avec le statut 201 et l’avis :{"stars": 5, "text": "Lovely"}. Stocke et envoie uniquement ces deux champs. - Dans les deux routes, lorsque
hasRecipe(id)vaut false, réponds avec le statut 404 et{"error": "No such recipe"}. - Dans
server.js, importe le routeur et monte-le sur/api/recipes/:id/reviews, à côté du routeur des recettes et avant le gestionnaire 404.
Essaie : Appuie sur « Jouer » et envoie /api/recipes/1/reviews : []. Choisis POST et envoie {"stars": 5, "text": "Lovely"} à /api/recipes/1/reviews : statut 201 et l’avis. Effectue à nouveau une requête GET sur /api/recipes/1/reviews : [{"stars":5,"text":"Lovely"}]. Envoie /api/recipes/2/reviews : toujours [], car chaque recette conserve ses propres avis. Envoie /api/recipes/99/reviews : statut 404 et {"error":"No such recipe"}.
Essayez vous-même
import express from 'express';
import { recipes } from '../data.js';
// Avis par id de recette, comme { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};
const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));
const router = express.Router();
// GET / liste les avis d’une recette. POST / en ajoute un.
export default router;
Toutes les leçons de Les bases d’Express
Entraînez-vous par vous-même : Playground Express