Menu
CoddyTech

Rutas anidadas

Parte de la sección Conceptos básicos de Express del Journey de Node.js de Coddy. Lección 20 de 23.

Las reseñas pertenecen a una receta, por lo que sus URL se encuentran dentro de ella: /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);

El req.params de un enrutador contiene solo los parámetros de sus propias rutas. El :isbn de la ruta de montaje pertenece a la aplicación, por lo que dentro del enrutador su valor es undefined, a menos que el enrutador se cree con mergeParams: true.

routes/reviews.js está listo, con un objeto reviews y una función auxiliar hasRecipe(id).

challenge icon

Desafío

Fácil

Los visitantes pueden dejar reseñas sobre una receta. Una reseña pertenece a una sola receta, así que su URL está debajo de esa receta: /api/recipes/1/reviews.

  1. En routes/reviews.js, haz que el enrutador pueda leer el id de la receta desde la ruta en la que está montado. Sin eso, req.params.id es undefined dentro del enrutador (consulta el texto de la lección).
  2. Añade una ruta GET para /. Devuelve las reseñas de esa receta como una lista JSON o una lista vacía, [], si todavía no tiene ninguna. Guarda las reseñas en el objeto reviews, una lista por id de receta, como { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Añade una ruta POST para /. Lee stars y text del cuerpo, añade la reseña a la lista de esa receta y responde con el estado 201 y la reseña: {"stars": 5, "text": "Lovely"}. Guarda y envía solo esos dos campos.
  4. En ambas rutas, cuando hasRecipe(id) sea false, responde con el estado 404 y {"error": "No such recipe"}.
  5. En server.js, importa el enrutador y móntalo en /api/recipes/:id/reviews, junto al enrutador de recetas y antes del controlador 404.

Pruébalo: Pulsa «Jugar» y envía /api/recipes/1/reviews: []. Elige POST y envía {"stars": 5, "text": "Lovely"} a /api/recipes/1/reviews: estado 201 y la reseña. Vuelve a hacer GET a /api/recipes/1/reviews: [{"stars":5,"text":"Lovely"}]. Envía /api/recipes/2/reviews: sigue siendo [], porque cada receta conserva sus propias reseñas. Envía /api/recipes/99/reviews: estado 404 y {"error":"No such recipe"}.

Pruébalo tú mismo

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

// Reseñas por id de receta, como { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

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

const router = express.Router();

// GET / muestra las reseñas de una receta. POST / añade una.

export default router;

Todas las lecciones de Conceptos básicos de Express

Practica por tu cuenta: Playground de Express