Menu
CoddyTech

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

challenge icon

Défi

Facile

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

  1. 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.id vaut undefined dans le routeur (voir le texte de la leçon).
  2. 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’objet reviews, une liste par identifiant de recette, comme { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Ajoute une route POST pour /. Elle lit stars et text dans 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.
  4. Dans les deux routes, lorsque hasRecipe(id) vaut false, réponds avec le statut 404 et {"error": "No such recipe"}.
  5. 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