Menu
CoddyTech

Zagnieżdżone trasy

Część sekcji Podstawy Express ścieżki Node.js w Coddy. Lekcja 20 z 23.

Recenzje dotyczą jednego przepisu, więc ich adresy URL znajdują się pod nim: /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);

Obiekt req.params routera zawiera tylko parametry jego własnych ścieżek. Parametr :isbn w ścieżce montowania należy do aplikacji, więc wewnątrz routera ma wartość undefined, chyba że router zostanie utworzony z opcją mergeParams: true.

Plik routes/reviews.js jest gotowy i zawiera obiekt reviews oraz funkcję pomocniczą hasRecipe(id).

challenge icon

Wyzwanie

Łatwy

Odwiedzający mogą zostawiać opinie o przepisach. Opinia należy do jednego przepisu, dlatego jej adres URL znajduje się pod adresem tego przepisu: /api/recipes/1/reviews.

  1. W pliku routes/reviews.js skonfiguruj router tak, aby mógł odczytać identyfikator przepisu ze ścieżki, pod którą jest zamontowany. Bez tego req.params.id ma wewnątrz routera wartość undefined (zobacz treść lekcji).
  2. Dodaj trasę GET dla /. Zwraca ona opinie o tym przepisie jako listę JSON lub pustą listę, [], jeśli nie ma jeszcze żadnych opinii. Przechowuj opinie w obiekcie reviews, po jednej liście dla każdego identyfikatora przepisu, na przykład { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Dodaj trasę POST dla /. Odczytuje ona stars i text z treści żądania, dodaje opinię do listy tego przepisu i odpowiada statusem 201 oraz opinią: {"stars": 5, "text": "Lovely"}. Zapisuj i wysyłaj tylko te dwa pola.
  4. W obu trasach, gdy hasRecipe(id) ma wartość false, odpowiedz statusem 404 i {"error": "No such recipe"}.
  5. W pliku server.js zaimportuj router i zamontuj go pod adresem /api/recipes/:id/reviews, obok routera przepisów i przed obsługą błędu 404.

Wypróbuj: Naciśnij „Uruchom” i wyślij żądanie na adres /api/recipes/1/reviews: []. Wybierz POST i wyślij {"stars": 5, "text": "Lovely"} na adres /api/recipes/1/reviews: otrzymasz status 201 i opinię. Ponownie wykonaj żądanie GET na adres /api/recipes/1/reviews: [{"stars":5,"text":"Lovely"}]. Wyślij żądanie na adres /api/recipes/2/reviews: nadal otrzymasz [], ponieważ każdy przepis ma własne opinie. Wyślij żądanie na adres /api/recipes/99/reviews: otrzymasz status 404 i {"error":"No such recipe"}.

Spróbuj swoich sił

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

// Recenzje według id przepisu, na przykład { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

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

const router = express.Router();

// GET / wyświetla recenzje przepisu. POST / dodaje recenzję.

export default router;

Wszystkie lekcje w sekcji Podstawy Express

Poćwicz samodzielnie: Edytor online Express