Menu
CoddyTech

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

challenge icon

Desafio

Fácil

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

  1. 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 é undefined dentro do roteador (veja o texto da lição).
  2. 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 objeto reviews, uma lista por id de receita, como { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Adicione uma rota POST para /. Ela lê stars e text do 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.
  4. Em ambas as rotas, quando hasRecipe(id) for false, responda com o status 404 e {"error": "No such recipe"}.
  5. 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