İç İçe Rotalar
Coddy'nin Node.js Journey'sinin Express Temelleri bölümünün bir parçası. Ders 20 / 23.
Yorumlar bir tarife aittir, bu yüzden URL’leri onun altında yer alır: /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);Bir yönlendiricinin req.params nesnesi yalnızca kendi yollarının parametrelerini tutar. Bağlama yolundaki :isbn uygulamaya aittir, bu nedenle yönlendiricinin içinde undefined olur; yönlendirici mergeParams: true ile oluşturulmadığı sürece.
routes/reviews.js dosyası, reviews nesnesi ve hasRecipe(id) yardımcı işleviyle hazır.
Görev
KolayZiyaretçiler bir tarife yorum bırakabilir. Bir yorum tek bir tarife aittir, bu nedenle URL'si o tarifin altında yer alır: /api/recipes/1/reviews.
routes/reviews.jsdosyasında yönlendiricinin, bağlandığı yoldan tarif kimliğini okuyabilmesini sağla. Aksi takdirde yönlendiricinin içindereq.params.iddeğeriundefinedolur (ders metnine bak)./için bir GET rotası ekle. Bu rota, tarifin yorumlarını JSON listesi olarak döndürür; henüz hiç yorumu yoksa boş bir liste olan[]döndürür. Yorumlarıreviewsnesnesinde, her tarif kimliği için bir liste olacak şekilde sakla; örneğin{ "1": [{ "stars": 5, "text": "Lovely" }] }./için bir POST rotası ekle. Bu rota gövdedenstarsvetextdeğerlerini okur, yorumu ilgili tarifin listesine ekler ve 201 durum koduyla birlikte yorumu yanıt olarak gönderir:{"stars": 5, "text": "Lovely"}. Yalnızca bu iki alanı sakla ve gönder.- Her iki rotada da
hasRecipe(id)değeri false olduğunda 404 durum koduyla birlikte{"error": "No such recipe"}yanıtını gönder. server.jsdosyasında yönlendiriciyi içe aktar ve tarifler yönlendiricisinin yanına, 404 işleyicisinden önce,/api/recipes/:id/reviewsyoluna bağla.
Deneyin: “Oyna” düğmesine bas ve /api/recipes/1/reviews isteğini gönder: []. POST'u seç ve {"stars": 5, "text": "Lovely"} değerini /api/recipes/1/reviews adresine gönder: 201 durum kodu ve yorum. GET ile /api/recipes/1/reviews isteğini yeniden gönder: [{"stars":5,"text":"Lovely"}]. /api/recipes/2/reviews isteğini gönder: her tarif kendi yorumlarını tuttuğu için sonuç yine [] olur. /api/recipes/99/reviews isteğini gönder: 404 durum kodu ve {"error":"No such recipe"}.
Kendin dene
import express from 'express';
import { recipes } from '../data.js';
// Tarif id değerine göre yorumlar, örneğin { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};
const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));
const router = express.Router();
// GET / bir tarifin yorumlarını listeler. POST / bir yorum ekler.
export default router;
Express Temelleri bölümündeki tüm dersler
Kendi başına pratik yap: Express playground