عندما تكون مبتدئًا ، فقد اكتشفت مشهدًا مختلفًا تمامًا عن وجهة نظرك السابقة - ما الذي يستخدمه JavaScript في عينيك؟ المؤثرات الخاصة؟ أم أنها مجرد تفاعل مع العميل؟ يمكن القول أن JavaScript تم تشغيله لأول مرة في المتصفح. ومع ذلك ، إذا كنت تفكر في الأمر بهذه الطريقة ، فإن المتصفح يوفر فقط سياقًا يحدد ما يمكنك فعله مع JavaScript. هنا يمكنك التفكير في الأمر كمؤسسة مماثلة. تحدد المؤسسة ما يمكنك القيام به هنا ، لكنه لا يقول الكثير عن لغة جافا سكريبت نفسها. في الواقع ، كلغة كاملة ، يمكن استخدام JavaScript في سياقات مختلفة ويعكس قدرات مختلفة. إن Nodejs المذكورة هنا هي في الواقع وضعها بصراحة ، والتي توفر سياقًا وبيئة جارية ، مما يسمح بتشغيل رمز JavaScript على الواجهة الخلفية (خارج بيئة المتصفح).
جوهر التوجيه هو التوجيه. كما يوحي الاسم ، يشير التوجيه إلى طرق المعالجة المختلفة التي نحتاجها للتعامل مع عناوين URL المختلفة ، مثل منطق أعمال المعالجة/START ومعالجتها/تحميل منطق الأعمال ؛ المنطق غير متسق. في الواقع ، ستنتهي عملية التوجيه في وحدة التوجيه ، ووحدة التوجيه ليست وحدة حقيقية "تتخذ الإجراء" مقابل الطلب ، وإلا فلن يتمكن تطبيقنا من توسيعه جيدًا عندما يصبح أكثر تعقيدًا.
هنا نقوم أولاً بإنشاء وحدة نمطية تسمى requestHandlers ، ونضيف وظيفة عنصر نائب لكل معالج طلب:
نسخة الكود كما يلي:
وظيفة start () {
console.log ("تم استدعاء معالج الطلب" Start ".") ؛
وظيفة النوم (ميلي ثانية) {
var startTime = date date (). getTime () ؛
بينما (تاريخ جديد (). getTime () <starttime+milliseconds) ؛
}
النوم (10000) ؛
العودة "مرحبا ابدأ" ؛
}
وظيفة تحميل () {
console.log ("تم استدعاء معالج الطلب" تحميل ".") ؛
إرجاع "Hello Upload" ؛
}
orports.start = start ؛
orports.upload = تحميل ؛
وبهذه الطريقة ، يمكننا توصيل معالج الطلب ووحدة التوجيه لجعل المسار "لديه طريقة لمتابعة". بعد ذلك ، قررنا تمرير سلسلة من معالجات الطلب من خلال كائن ، ونحن بحاجة إلى استخدام طرق مقترنة بشكل فضفاض لحقن هذا الكائن في وظيفة جهاز التوجيه () ، فهرس الملف الرئيسي:
نسخة الكود كما يلي:
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 ، مقبض) ؛
كما هو موضح أعلاه ، من السهل تعيين عناوين URL المختلفة لنفس معالج الطلب: ما عليك سوى إضافة خاصية باستخدام المفتاح "/" إلى الكائن ، المقابل لـ requestHandlers.start. وبهذه الطريقة ، يمكننا ببساطة تكوين / بدء و / / للتعامل مع كلا الطلبات للبدء. بعد الانتهاء من النظر في تعريف الكائن ، نقوم بتمريره كمعلمة إضافية إلى الخادم ، انظر 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"}) ؛
var content = route (المقبض ، اسم المسار) ؛
استجابة. write (المحتوى) ؛
استجابة.
}
http.createserver (onrequest) .Listen (8888) ؛
console.log ("بدأ الخادم.") ؛
}
orports.start = start ؛
وبهذه الطريقة ، تتم إضافة معلمة المقبض إلى وظيفة Start () ، ويتم تمرير كائن المقبض كمعلمة الأولى لوظيفة رد الاتصال Route (). ما يلي يحدد route.js:
نسخة الكود كما يلي:
مسار الوظيفة (مقبض ، مسار) {
console.log ("على وشك توجيه طلب"+ pathname) ؛
if (typeof handle [pathname] === 'function') {
إرجاع مقبض [pathname] () ؛
}آخر{
console.log ("لا يوجد معالج طلب لـ"+pathname) ؛
العودة "404 لم يتم العثور عليها" ؛
}
}
orports.route = الطريق ؛
من خلال الرمز أعلاه ، نتحقق أولاً مما إذا كان معالج الطلب المقابل للمسار المحدد موجودًا ، وإذا كان الأمر كذلك ، فسنقوم باستدعاء الوظيفة المقابلة مباشرة. يمكننا الحصول على وظيفة معالجة الطلب من الكائن الذي تم تمريره بنفس طريقة الحصول على عناصر من الصفيف الترابطي ، أي ، التعامل [pathname] () ؛ مثل هذا التعبير يمنح الناس الشعور بأنه يقول "مرحبًا ، الرجاء مساعدتي في هذا المسار". تأثير تشغيل البرنامج على النحو التالي: