Rotas Aninhadas
Parte da seção Fundamentos de Express do Journey de Node.js da Coddy. Lição 20 de 23.
As avaliações pertencem a uma receita, então os URLs ficam sob ela: /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);O req.params de um roteador contém apenas os parâmetros dos próprios caminhos dele. O :isbn no caminho de montagem pertence ao app, então, dentro do roteador, ele é undefined, a menos que o roteador seja criado com mergeParams: true.
routes/reviews.js está pronto, com um objeto reviews e um auxiliar hasRecipe(id).
Desafio
FácilOs visitantes podem deixar avaliações em uma receita. Uma avaliação pertence a uma receita, então sua URL fica dentro da URL dessa receita: /api/recipes/1/reviews.
- Em
routes/reviews.js, configure o roteador para ler o id da receita no caminho em que ele está montado. Sem isso,req.params.idéundefineddentro do roteador (veja o texto da lição). - Adicione uma rota GET para
/. Ela retorna as avaliações dessa receita como uma lista JSON, ou uma lista vazia,[], se ainda não houver nenhuma. Mantenha as avaliações no objetoreviews, uma lista por id de receita, como{ "1": [{ "stars": 5, "text": "Lovely" }] }. - Adicione uma rota POST para
/. Ela lêstarsetextdo corpo da requisição, adiciona a avaliação à lista dessa receita e responde com o status 201 e a avaliação:{"stars": 5, "text": "Lovely"}. Armazene e envie somente esses dois campos. - Em ambas as rotas, quando
hasRecipe(id)for false, responda com o status 404 e{"error": "No such recipe"}. - Em
server.js, importe o roteador e monte-o em/api/recipes/:id/reviews, ao lado do roteador de receitas e antes do manipulador de erro 404.
Experimente: Pressione “Jogar” e envie /api/recipes/1/reviews: []. Selecione POST e envie {"stars": 5, "text": "Lovely"} para /api/recipes/1/reviews: status 201 e a avaliação. Faça novamente um GET para /api/recipes/1/reviews: [{"stars":5,"text":"Lovely"}]. Envie /api/recipes/2/reviews: continua sendo [], porque cada receita mantém suas próprias avaliações. Envie /api/recipes/99/reviews: status 404 e {"error":"No such recipe"}.
Experimente você mesmo
import express from 'express';
import { recipes } from '../data.js';
// Avaliações por id da receita, como { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};
const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));
const router = express.Router();
// GET / lista as avaliações de uma receita. POST / adiciona uma avaliação.
export default router;
Todas as lições de Fundamentos de Express
Pratique por conta própria: Playground de Express