المسارات المتداخلة
جزء من قسم أساسيات Express في رحلة Node.js على Coddy. الدرس 20 من 23.
تنتمي المراجعات إلى وصفة واحدة، لذا تكون عناوين URL الخاصة بها ضمنها: /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 في الموجّه على معلمات مساراته الخاصة فقط. ينتمي :isbn في مسار الإسناد إلى التطبيق، لذا تكون قيمته داخل الموجّه undefined، ما لم يُنشأ الموجّه باستخدام mergeParams: true.
أصبح الملف routes/reviews.js جاهزًا، ويحتوي على كائن reviews ودالة مساعدة hasRecipe(id).
التحدي
سهليمكن للزوار ترك مراجعات لوصفة. تنتمي المراجعة إلى وصفة واحدة، لذا يكون عنوان URL الخاص بها ضمن عنوان تلك الوصفة: /api/recipes/1/reviews.
- في
routes/reviews.js، اجعل الموجّه قادرًا على قراءة معرّف الوصفة من المسار الذي جرى إرفاقه به. من دون ذلك، تكون قيمةreq.params.idهيundefinedداخل الموجّه (راجع نص الدرس). - أضف مسار GET لـ
/. يعيد مراجعات تلك الوصفة كقائمة JSON، أو قائمة فارغة،[]، إذا لم تكن لديها مراجعات بعد. احتفظ بالمراجعات في الكائنreviews، بقائمة واحدة لكل معرّف وصفة، مثل{ "1": [{ "stars": 5, "text": "Lovely" }] }. - أضف مسار POST لـ
/. يقرأstarsوtextمن متن الطلب، ويضيف المراجعة إلى قائمة تلك الوصفة، ثم يردّ بالحالة 201 والمراجعة:{"stars": 5, "text": "Lovely"}. خزّن هذين الحقلين فقط وأرسلهما. - في كلا المسارين، عندما تكون
hasRecipe(id)قيمتها false، أرسل استجابة بالحالة 404 و{"error": "No such recipe"}. - في
server.js، استورد الموجّه وأرفقه عند/api/recipes/:id/reviews، بجوار موجّه الوصفات وقبل معالج 404.
جرّب ذلك: اضغط «العب» وأرسل /api/recipes/1/reviews: []. اختر POST وأرسل {"stars": 5, "text": "Lovely"} إلى /api/recipes/1/reviews: الحالة 201 والمراجعة. أرسل GET إلى /api/recipes/1/reviews مجددًا: [{"stars":5,"text":"Lovely"}]. أرسل /api/recipes/2/reviews: تظل النتيجة []، لأن لكل وصفة مراجعاتها الخاصة. أرسل /api/recipes/99/reviews: الحالة 404 و{"error":"No such recipe"}.
جرّب بنفسك
import express from 'express';
import { recipes } from '../data.js';
// التقييمات حسب معرّف الوصفة، مثل { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};
const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));
const router = express.Router();
// يعرض GET / تقييمات وصفة. ويضيف POST / تقييمًا واحدًا.
export default router;
جميع دروس أساسيات Express
تدرّب بنفسك: Playground لـ Express