Express.js / الأساسي: مسؤولية الطلب والاستجابة / الدرس 3
ترتيب الوسائط ومسار التحكم
ابن سلسلة طلب مرتبة تملك كل شعبة فيها مسؤولاً واضحاً عن الإكمال أو تمرير الخطأ.
في هذه الصفحة
أهداف الدرس
- توقع الوسيط التالي بعد next أو إكمال الرد أو next(error).
- رتب التحليل والهوية وفحوص المجال والمعالجات النهائية وفق اعتماد كل منها.
ترتيب التسجيل جزء من سلوك التطبيق
تشكل الوسائط سلسلة مرتبة من المعالجات المطابقة. يستطيع معالج سجل أولاً رفض الطلب قبل وصوله للمسارات التالية، أو إرفاق معلومات تحتاجها، أو استهلاك رد أردته لمعالج آخر عن طريق الخطأ. يمكن لـapp.use تركيب وسيط تحت بادئة مسار، وتجمع طريقة المسار بين طريقة HTTP ونمط العنوان. لذلك ليس ترتيب الملف مجرد تنسيق. اكتب سلسلة الاعتمادات صراحة: يحتاج التحقق المعتمد على الجسم إلى تحليله أولاً، وتحتاج سياسة الكائن هوية مثبتة، ويوضع منسق الأخطاء بعد ما قد يمرر أخطاء إليه.
قدم عمل الحدود على عمل المجال
يوضح الجزء سلسلة API فيها تحليل JSON محدود، ووسيط هوية محقون، وموجه للمقررات. يملك معالج عادي أخير الطلبات غير المطابقة، ويملك معالج الأخطاء حالات الفشل الممررة. الأسماء اعتمادات تراجع مستقلة وليست مصادقة أو تحققاً يوفرهما Express تلقائياً. تحليل الجسم قبل الهوية خيار تصميم لا قاعدة عامة؛ قد توثق الهوية من الترويسات أولاً لرفض العمل غير المسموح قبل التحليل، وقد يتطلب بروتوكول آخر جسماً خاماً متحققاً منه لرد موقع. اختر الترتيب من متطلبات البروتوكول الفعلي وحدود موارده.
app.use("/api", express.json({limit:"16kb"}));
app.use("/api", establishPrincipal);
app.use("/api/courses", courseRouter);
app.use((req,res) => res.status(404).json({code:"ROUTE_NOT_FOUND"}));
app.use((err,req,res,next) => {
if (res.headersSent) return next(err);
return res.status(500).json({code:"INTERNAL_ERROR"});
});
يمثل حد 16kb اختيار عينة تدريبية لا توصية إنتاج عامة. لا يشغل المثال express أو الاعتمادات المسماة.
عامل next كتمرير للتحكم لا كإكمال إضافي
تتابع next() الوسائط العادية المطابقة، بينما تنقل next(error) التنفيذ لمعالجة الأخطاء وتتجاوز المعالجات العادية، مع استثناء سلاسل التحكم الخاصة الموثقة في سياقاتها. لا يستدعي معالج أرسل الرد النهائي next كتنظيف روتيني؛ فقد يحاول التالي إرسال رد آخر. وقد ينشئ الاستدعاء المزدوج مسارين للتنفيذ. ضع التنظيف تحت مسؤولية دورة الحياة المناسبة، وتأكد من أن ردود النداء والوعود وفروع catch لا تمرر الفشل نفسه كل منها مستقلاً. يستحق تمرير التحكم العناية نفسها التي تمنحها للقيم المعادة في دالة عادية.
نمذج الرفض المبكر دون ادعاء تشغيل Express
تشغل السلسلة المحلية التالية دوال متزامنة بسيطة على حالة اصطناعية. توقف false النموذج، فيثبت الاختبار أن الهوية الممنوعة لا تصل إلى عمل المجال. يتعمد النموذج عدم محاكاة مطابقة المسار أو next غير المتزامنة أو توزيع أخطاء Express. تبقي هذه الحدود دليله ضيقاً وحتمياً. القاعدة المفيدة أن فحص الشرط يسبق الأثر المحمي. وينبغي لاختبار دمج فعلي تأكيد القاعدة في ترتيب الوسائط الحقيقي، بما فيه رد الرفض وغياب أي استدعاء كتابة، لا الاكتفاء بملاحظة اسم الدالة في الملف.
function run(steps,state) {
for (const step of steps) if (step(state) === false) break;
return state;
}
const state = {allowed:false, trace:[]};
run([
s => {s.trace.push("identity");},
s => {s.trace.push("policy"); return s.allowed;},
s => {s.trace.push("write");}
],state);
console.assert(JSON.stringify(state.trace) === '["identity","policy"]');
تسجل العينة الممنوعة identity وpolicy فقط. هذه حلقة عادية وليست تنفيذاً لـnext أو وسيط أخطاء Express.
افصل حالة الطلب عن حالة العملية
ضع معلومات كل طلب في خاصية موثقة من req أو في res.locals، لا في متغير عام قابل للتغيير باسم currentUser. قد تستبدل الطلبات المتداخلة هوية بعضها في الحالة الثانية. يختلف عمر الإعداد العام واعتمادات الخدمة الثابتة عن عمر الهوية وقياسات الزمن ومخبأ الطلب. كذلك يؤثر تركيب الموجه تحت بادئة في تفسير خصائص المسار؛ فاستعمل دلالات originalUrl وbaseUrl وpath الموثقة بدلاً من دمج نصوص بالتخمين. عند تشخيص سلسلة تختلف تحت الطلبات المتزامنة، راجع ترتيب التسجيل وعمر الحالة معاً.
الأخطاء الشائعة وإصلاحها
لا يرى التحقق جسماً محللاً
- لماذا يحدث؟
- سبق التحقق المعتمد على الجسم وسيط التحليل المطابق.
- كيف تصلحه؟
- قدم المحلل على ذلك التحقق ضمن نطاق المسار المقصود.
- كيف تتجنب تكراره؟
- اختبر السلسلة المركبة فعلياً بأنواع المحتوى المدعومة.
يرسل معالج لاحق بعد الرفض
- لماذا يحدث؟
- أنهى معالج الرفض الرد واستدعى next أيضاً.
- كيف تصلحه؟
- استخدم مسار إكمال واحداً واضحاً وعد بعد إرسال الرد.
- كيف تتجنب تكراره؟
- أكد غياب استدعاء المجال بعد الرفض.
يستعمل طلب هوية مستخدم آخر
- لماذا يحدث؟
- حفظ متغير عام قابل للتغيير حالة خاصة بالطلب.
- كيف تصلحه؟
- انقل بيانات الهوية إلى دورة الطلب.
- كيف تتجنب تكراره؟
- اختبر هويات متداخلة بلا حالة هوية مشتركة قابلة للتغيير.
اختبر فهمك
1. هل يجب أن تحلل كل واجهة JSON قبل المصادقة دائماً؟
اعرض الحل المشروح
لا؛ يعتمد الترتيب على البروتوكول. قد ترفض مصادقة الترويسة الطلب قبل التحليل، بينما يحتاج رد موقع إلى جسم خام متحقق منه وإجراء هوية مختلف. صرح بالاعتمادات والحدود واختبر الترتيب المختار، ولا تحول المثال التوضيحي إلى وصفة أمن عامة.
2. ما الدليل اللازم فوق نموذج حلقة run المحلية؟
اعرض الحل المشروح
يحتاج الدمج إلى فحص المطابقة والإكمال غير المتزامن ورد الرفض الدقيق وتشغيل ما بعده أو عدمه. تثبت الحلقة ترتيبها المتزامن وقاعدة الإيقاف فقط. احفظ الفصل حتى لا تسم نجاحها اختباراً لسلسلة مصادقة Express.
أهم ما تعلمته
- يحدد الترتيب ومسؤولية الإكمال سلوك الوسائط.
- تنتمي هوية الطلب إلى دورة حياته.