Menu
CoddyTech

Route annidate

Fa parte della sezione Fondamenti di Express del percorso Node.js di Coddy. Lezione 20 di 23.

Le recensioni appartengono a una ricetta, quindi i relativi URL si trovano al suo interno: /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);

req.params di un router contiene solo i parametri dei suoi percorsi. :isbn nel percorso di montaggio appartiene all'app, quindi all'interno del router è undefined, a meno che il router non venga creato con mergeParams: true.

routes/reviews.js è pronto, con un oggetto reviews e una funzione helper hasRecipe(id).

challenge icon

Sfida

Facile

I visitatori possono lasciare recensioni per una ricetta. Una recensione appartiene a una sola ricetta, quindi il suo URL si trova sotto quella ricetta: /api/recipes/1/reviews.

  1. In routes/reviews.js, fai in modo che il router possa leggere l’id della ricetta dal percorso su cui è montato. Senza questo, req.params.id è undefined all’interno del router (vedi il testo della lezione).
  2. Aggiungi una route GET per /. Restituisce le recensioni di quella ricetta come elenco JSON oppure un elenco vuoto, [], se non ne ha ancora. Conserva le recensioni nell’oggetto reviews, un elenco per ogni id di ricetta, come { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Aggiungi una route POST per /. Legge stars e text dal corpo della richiesta, aggiunge la recensione all’elenco di quella ricetta e risponde con lo stato 201 e la recensione: {"stars": 5, "text": "Lovely"}. Memorizza e invia solo questi due campi.
  4. In entrambe le route, quando hasRecipe(id) è false, rispondi con lo stato 404 e {"error": "No such recipe"}.
  5. In server.js, importa il router e montalo su /api/recipes/:id/reviews, accanto al router delle ricette e prima del gestore 404.

Prova: premi «Gioca» e invia /api/recipes/1/reviews: []. Seleziona POST e invia {"stars": 5, "text": "Lovely"} a /api/recipes/1/reviews: stato 201 e la recensione. Esegui di nuovo GET su /api/recipes/1/reviews: [{"stars":5,"text":"Lovely"}]. Invia /api/recipes/2/reviews: ancora [], perché ogni ricetta conserva le proprie recensioni. Invia /api/recipes/99/reviews: stato 404 e {"error":"No such recipe"}.

Provalo tu

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

// Recensioni per id della ricetta, come { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

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

const router = express.Router();

// GET / elenca le recensioni di una ricetta. POST / ne aggiunge una.

export default router;

Tutte le lezioni di Fondamenti di Express

Esercitati da solo: Playground Express