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).
Wyzwanie
ŁatwyOdwiedzają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.
- W pliku
routes/reviews.jsskonfiguruj router tak, aby mógł odczytać identyfikator przepisu ze ścieżki, pod którą jest zamontowany. Bez tegoreq.params.idma wewnątrz routera wartośćundefined(zobacz treść lekcji). - 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 obiekciereviews, po jednej liście dla każdego identyfikatora przepisu, na przykład{ "1": [{ "stars": 5, "text": "Lovely" }] }. - Dodaj trasę POST dla
/. Odczytuje onastarsitextz 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. - W obu trasach, gdy
hasRecipe(id)ma wartość false, odpowiedz statusem 404 i{"error": "No such recipe"}. - W pliku
server.jszaimportuj 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