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).
Desafío
FácilLos 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.
- 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.idesundefineddentro del enrutador (consulta el texto de la lección). - 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 objetoreviews, una lista por id de receta, como{ "1": [{ "stars": 5, "text": "Lovely" }] }. - Añade una ruta POST para
/. Leestarsytextdel 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. - En ambas rutas, cuando
hasRecipe(id)sea false, responde con el estado 404 y{"error": "No such recipe"}. - 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