Menu
CoddyTech

المسارات المتداخلة

جزء من قسم أساسيات 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).

challenge icon

التحدي

سهل

يمكن للزوار ترك مراجعات لوصفة. تنتمي المراجعة إلى وصفة واحدة، لذا يكون عنوان URL الخاص بها ضمن عنوان تلك الوصفة: /api/recipes/1/reviews.

  1. في routes/reviews.js، اجعل الموجّه قادرًا على قراءة معرّف الوصفة من المسار الذي جرى إرفاقه به. من دون ذلك، تكون قيمة req.params.id هي undefined داخل الموجّه (راجع نص الدرس).
  2. أضف مسار GET لـ /. يعيد مراجعات تلك الوصفة كقائمة JSON، أو قائمة فارغة، []، إذا لم تكن لديها مراجعات بعد. احتفظ بالمراجعات في الكائن reviews، بقائمة واحدة لكل معرّف وصفة، مثل { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. أضف مسار POST لـ /. يقرأ stars وtext من متن الطلب، ويضيف المراجعة إلى قائمة تلك الوصفة، ثم يردّ بالحالة 201 والمراجعة: {"stars": 5, "text": "Lovely"}. خزّن هذين الحقلين فقط وأرسلهما.
  4. في كلا المسارين، عندما تكون hasRecipe(id) قيمتها false، أرسل استجابة بالحالة 404 و{"error": "No such recipe"}.
  5. في 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