موجّه Express
جزء من قسم أساسيات Express في رحلة Node.js على Coddy. الدرس 19 من 23.
يحتوي server.js الآن على الصفحات ومسارات API والبرمجيات الوسيطة، ولا يزال يكبر.
// routes/books.js
const router = express.Router();
router.get('/', (req, res) => res.json(books));
router.get('/:isbn', (req, res) => res.json(findBook(req.params.isbn)));
export default router;
// server.js
app.use('/api/books', booksRouter);تنشئ express.Router() تطبيقًا صغيرًا له مساراته الخاصة، محفوظة في ملفه الخاص. تقوم app.use('/api/books', booksRouter) بإرفاقه: يستجيب / الخاص بالموجّه إلى GET /api/books، ويستجيب /:isbn الخاص به إلى GET /api/books/9780141439518. تُكتب البادئة مرة واحدة، في app.use. ولا تزال الأخطاء التي تُطرح داخل الموجّه تصل إلى معالج الأخطاء في التطبيق.
يحتوي الملف الجديد routes/recipes.js بالفعل على مسار واحد، وهو /tags.
التحدي
سهليستمر server.js في النمو. انقل واجهة API الخاصة بالوصفات إلى ملفها الخاص، routes/recipes.js، الذي يحتوي بالفعل على مسار يسرد كل الوسوم.
- في
routes/recipes.js، أسفل مسار/tags، أضف مسارات API الأربعة منserver.js: مسار القائمة، ومسار وصفة واحدة حسب المعرّف، ومسار POST الذي يضيف وصفة، ومسار التحجيم. داخل موجّه، احذف الجزء/api/recipesمن كل مسار: يصبح/api/recipes/:idهو/:id، ويصبح مسار القائمة/. - أبقِها أسفل
/tags. يجرّب Express المسارات بالترتيب، وإذا وُضع/:idأولًا فسيطابق/tagsويبحث عن وصفة يكون معرّفهاtags. - احذف تلك المسارات الأربعة من
server.js. - في
server.js، استورد الموجّه من./routes/recipes.jsوأرفقه عند/api/recipesباستخدامapp.use، في الموضع الذي كانت فيه المسارات الأربعة: بعدexpress.json()وقبل معالج 404.
جرّب ذلك: اضغط على «العب» وأرسل /api/recipes/tags. ينبغي أن ترى ["breakfast","dinner","soup","sweet","vegan"]. أرسل /api/recipes/2: وصفة Pancakes، كما في السابق. أرسل POST يتضمن {"title": "Toast"} إلى /api/recipes: الحالة 201. ثم أرسل /api/recipes/5/scale?by=2: الحالة 500 و{"error":"Something went wrong"}، وهذا يعني أن الأخطاء التي تُرمى داخل الموجّه لا تزال تصل إلى معالج الأخطاء. لم تتغير عناوين URL؛ بل تغير موضع وجود الشيفرة فقط.
جرّب بنفسك
import express from 'express';
import { recipes } from '../data.js';
const router = express.Router();
// كل وسم مرة واحدة، بالترتيب الأبجدي.
router.get('/tags', (req, res) => {
const tags = new Set(recipes.flatMap((recipe) => recipe.tags));
res.json([...tags].sort());
});
// انقل مسارات /api/recipes من server.js إلى هنا، أسفل /tags.
// داخل router، تكون المسارات نسبية إلى الموضع الذي يُثبَّت فيه.
export default router;
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس أساسيات Express
تدرّب بنفسك: Playground لـ Express