من أجل تقديم ملاحظات مختلفة حول الطلبات المختلفة ، نقدم وحدة معالج الأحداث.
تسمى الوحدة اسم requestHandlers. نضيف أولاً وظيفتين من العناصر النائبة ، start () و upload ().
رمز requestHandlers.js كما يلي:
نسخة الكود كما يلي:
وظيفة start () {
console.log ("اتصل بهذا عند الوصول /النجم.") ؛
}
وظيفة تحميل () {
console.log ("اتصل بهذا عند الوصول/التحميل.") ؛
}
orports.start = start ؛
orports.upload = تحميل ؛
في التطبيقات الحقيقية ، سيستمر عدد معالجات الطلب في الزيادة. بالطبع ، لا نريد إكمال الطلب في المسار في كل مرة يكون هناك عنوان URL أو معالج طلب جديد.
رسم الخرائط إلى المعالج بشكل متكرر.
بالإضافة إلى ذلك ، لا نريد أن يكون لدينا الكثير من الطلب == x ، ثم اتصل بمعالج y في المسار ، مما يجعل الكود يبدو فوضويًا وغير محترف.
هنا سأستخدم مفهوم المصفوفات الترابطية للتعامل مع هذا المطلب. نقوم بتمرير سلسلة من معالجات الطلب من خلال كائن ما ونحتاج إلى ضخ هذا الكائن في وظيفة Route () بطريقة مقترنة بشكل فضفاض.
دعنا أولاً نقدم هذا الكائن في الملف الرئيسي index.js:
نسخة الكود كما يلي:
var server = required ("./ server") ؛
VAR ROUTER = require ("./ Router") ؛
var requestHandlers = require ("./ requestHandlers") ؛
var handle = {} ؛
التعامل مع ["/"] = requestHandlers.start ؛
التعامل ["/start"] = requestHandlers.start ؛
تعامل ["/expload"] = requestHandlers.Upload ؛
Server.start (Router.Route ، مقبض) ؛
على سبيل المثال ، إذا أردت إضافة خريطة A /Show ، فما عليك سوى إضافة مقبض [" /show"] requestHandlers.show ؛
هاها ، هل الرمز أكثر إيجازًا ومنظمًا؟ !
بعد ذلك ، نقوم بتمرير كائن المقبض إلى الخادم ، ويتم تعديل server.js على النحو التالي:
نسخة الكود كما يلي:
var http = require ("http") ؛
var url = require ("url") ؛
وظيفة بدء (المسار ، مقبض) {
وظيفة onrequest (طلب ، استجابة) {
var pathname = url.parse (request.url) .PathName ؛
console.log ("طلب" + pathname + "تم استلامه.") ؛
الطريق (مقبض ، اسم المسار) ؛
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
الرد. write ("Hello World") ؛
استجابة.
}
http.createserver (onrequest) .Listen (8888) ؛
console.log ("بدأ الخادم.") ؛
}
orports.start = start ؛
قم بتعديل دالة Route () في ملف route.js في المقابل:
نسخة الكود كما يلي:
مسار الوظيفة (مقبض ، مسار) {
console.log ("على وشك توجيه طلب" + pathname) ؛
if (typeof handle [pathname] === 'function') {
مقبض [pathname] () ؛
} آخر {
console.log ("لا يوجد معالج طلب لـ" + pathname) ؛
}
}
orports.route = الطريق ؛
نقوم بتمرير كائن المقبض كمعلمة إلى الخادم ، ثم نتلقاه عن طريق المسار ، وأخيراً يحدد المسار ما إذا كان معالج الطلب المقابل للمسار الحالي موجودًا أم لا. إذا كانت موجودة ، اتصل بالوظيفة المقابلة.
يمكننا الحصول على وظيفة معالجة الطلبات من الكائن الذي تم تمريره بنفس الطريقة التي يتم بها الحصول على عناصر من الصفيف الترابطي ، لذلك لدينا تعبير بسيط وسلس مثل المقبض [pathname] () ، والذي يبدو وكأنه العناصر المذكورة سابقًا: "مرحبًا ، الرجاء مساعدتي في التعامل مع هذا المسار".
وبهذه الطريقة ، يمكننا إجراء معالجة مختلفة وفقًا لطلبات مختلفة.
في القسم التالي ، سنقوم بمراجعة الرمز للسماح للخادم بإجراء بعض عمليات التغذية المرتدة الفعلية.