Menu

التوجيه في Express وexpress.Router: المسارات والمعاملات

المسار في Express طريقة ومسار ومعالج: app.get('/users/:id', handler). اجمع المسارات المترابطة في express.Router() وركّبه تحت بادئة عبر app.use('/api', router).

تحتوي هذه الصفحة على محررات قابلة للتشغيل. حرّر، شغّل، وشاهد النتيجة فوراً.

يربط التوجيه في Express طريقة HTTP ومسارًا بدالة معالجة: يجيب app.get('/users', handler) على طلبات GET إلى /users، وتفعل app.post() وapp.put() وapp.delete() الشيء نفسه مع الطرق الأخرى. المقطع الذي يبدأ بنقطتين، كما في /users/:id، هو معامل مسار تصل قيمته إلى req.params. ولإبقاء تطبيق متنامٍ منظمًا، ضع المسارات المترابطة في express.Router() وركّبه تحت بادئة عبر app.use('/api', router).

يجيب GET /users/2 بـ {"id":2,"name":"Linus"}. معاملات المسار نصوص دائمًا، ولهذا يقارن المعالج بـ Number(req.params.id). أرسل POST /users مع الجسم {"name": "Grace"} لتحصل على 201، ثم DELETE /users/1 وGET /users لترى القائمة تتغير.

express.Router() مع بادئة

الموجّه تطبيق مصغّر له مساراته وmiddleware خاص به. مساراته نسبية: المسار المكتوب /:id داخل موجّه مركّب على /api/books يجيب على /api/books/:id. في مشروع حقيقي يكون كل موجّه في ملفه الخاص وينتهي بـ module.exports = router.

يعيد GET /api/books/1 القيمة {"id":1,"title":"Dune"}. يكتب router.route('/:id') المسار مرة واحدة ويسلسل معالجًا لكل طريقة؛ أرسل PUT /api/books/1 فتحصل على {"updated":"1"}. غيّر مسار التركيب إلى /v2/books فيجيب الموجّه نفسه هناك بدلًا من ذلك.

ترتيب المسارات: أول تطابق يفوز

يجرّب Express المسارات بالترتيب الذي سجّلتها به ويتوقف عند أول مسار يرسل استجابة. مسار المعامل يلتقط أي شيء في موضعه، فالمسار الثابت المسجّل بعده لا يُبلغ أبدًا:

يجيب GET /users/new بـ {"route":"/users/:id","id":"new"}: سُجّل مسار المعامل أولًا فأخذ الطلب. انقل مسار /users/new فوق /users/:id وشغّل من جديد لتحصل على {"route":"/users/new"}. ثم أرسل GET /books لتصل إلى معالج 404 في الأسفل.

معالج 404

يجيب Express على الطلب غير المطابق بصفحة HTML خاصة به، Cannot GET /books. أما في واجهة API فتريد عادة JSON، فأضف app.use() دون مسار كآخر مسار تمامًا، كما في المثال السابق. لا يعمل إلا حين تكون كل المسارات قبله قد مرّرت الطلب. الأخطاء التي ترميها المعالجات حالة مختلفة لها معالج خاص بأربعة وسائط، تغطيه صفحة معالجة الأخطاء في Express.

صيغة المسارات في Express 5

غيّر Express 5 صيغة المسارات، ومعظم المقتطفات على الإنترنت مكتوبة لـ Express 4:

النمطExpress 4Express 5
أي مسارapp.get('*', fn)app.get('/*splat', fn)
معامل اختياري/users/:id?/users{/:id}
نمط على معامل/users/:id(\\d+)غير مدعوم؛ افحص القيمة داخل المعالج

النجمة * المجردة أو ? بعد معامل ترمي TypeError عند تسجيل المسار، فلا يبدأ التطبيق.

أخطاء شائعة

تسجيل معالج 404 أولًا. يطابق app.use() دون مسار كل شيء، فيحصل كل طلب على 404. أبقِه في الأسفل.

نسيان أن البادئة تُحذف. داخل موجّه مركّب على /api، لا يتضمن req.path البادئة /api. استخدم req.originalUrl حين تحتاج المسار الكامل.

مقارنة معامل برقم. req.params.id === 1 خاطئة دائمًا لأن req.params.id هو النص '1'.

الأسئلة الشائعة

ما الفرق بين app.use وapp.get؟

يشغّل app.get('/users', fn) الدالة fn فقط لطلبات GET التي مسارها /users بالضبط. ويعمل app.use('/users', fn) مع كل الطرق ومع أي مسار يبدأ بـ /users، ولهذا يُستخدم لتركيب الموجّهات (routers) والـ middleware.

كيف أجعل المسارات في Express حساسة لحالة الأحرف؟

تتجاهل المسارات حالة الأحرف افتراضيًا، فيطابق /Users المسار /users. أوقف ذلك بـ app.set('case sensitive routing', true)، أو لكل موجّه على حدة بـ express.Router({ caseSensitive: true }).

لماذا يكون req.params فارغًا داخل موجّه متداخل؟

لا يرى الموجّه إلا معاملات مساراته هو. إذا كان مركّبًا على /users/:userId/posts، فأنشئه بـ express.Router({ mergeParams: true }) ليصبح req.params.userId القادم من مسار الأب متاحًا.

هل أضع كل المسارات في ملف واحد؟

ليس بعد أن يتجاوز عددها بضعة مسارات. أنشئ موجّهًا لكل مورد (routes/users.js وroutes/orders.js)، وصدّره بـ module.exports = router، وركّب كلًا منها في الملف الرئيسي عبر app.use().

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن