نريد تمرير كائن الاستجابة (الحصول على وظيفة رد الاتصال الخاصة بالخادم OnRequest ()) إلى معالج الطلب من خلال توجيه الطلب. يمكن للمعالج بعد ذلك استخدام الوظائف الموجودة على الكائن للرد على الطلب.
لنجري تغييرات على server.js أولاً:
نسخة الكود كما يلي:
var http = require ("http") ؛
var url = require ("url") ؛
وظيفة بدء (المسار ، مقبض) {
وظيفة onrequest (طلب ، استجابة) {
var pathname = url.parse (request.url) .PathName ؛
console.log ("طلب" + pathname + "تم استلامه.") ؛
الطريق (المقبض ، اسم المسار ، الاستجابة) ؛
}
http.createserver (onrequest) .Listen (8888) ؛
console.log ("بدأ الخادم.") ؛
}
orports.start = start ؛
نقوم بتمرير كائن الاستجابة كمعلمة ثالثة إلى وظيفة Route () ، ونقوم بإزالة جميع مكالمات الاستجابة في معالج onrequest () لأننا نريد أن يسمح هذا الجزء من العمل بالتكوين ().
بعد ذلك ، تعديل Router.js:
نسخة الكود كما يلي:
طريق الوظيفة (المقبض ، اسم المسار ، الاستجابة) {
console.log ("على وشك توجيه طلب" + pathname) ؛
if (typeof handle [pathname] === 'function') {
التعامل مع [pathname] (استجابة) ؛
} آخر {
console.log ("لا يوجد معالج طلب لـ" + pathname) ؛
Response.writehead (404 ، {"content-type": "text/plain"}) ؛
استجابة. write ("404 غير موجود") ؛
استجابة.
}
}
orports.route = الطريق ؛
نفس النمط: مقارنة بالاستحواذ السابق على قيمة الإرجاع من معالج الطلب ، هذه المرة بدلاً من ذلك ، يتم تمرير كائن الاستجابة مباشرة. إذا لم يكن هناك معالج طلب مقابل للتعامل معه ، فسنقوم بإرجاع الخطأ "404" مباشرة.
بعد ذلك ، تعديل requestHandler.js:
نسخة الكود كما يلي:
var exec = required ("child_process"). exec ؛
وظيفة بدء (استجابة) {
console.log ("تم استدعاء معالج الطلب" Start ".") ؛
exec ("ls -lah" ، وظيفة (خطأ ، stdout ، stderr) {
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
استجابة. write (stdout) ؛
استجابة.
}) ؛
}
تحميل الوظيفة (استجابة) {
console.log ("تم استدعاء معالج الطلب" تحميل ".") ؛
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
Response.write ("Hello Upload") ؛
استجابة.
}
orports.start = start ؛
orports.upload = تحميل ؛
تحتاج وظيفة المعالج لدينا إلى تلقي معلمة الاستجابة من أجل الاستجابة مباشرة للطلب. يقوم معالج البدء بإجراء عملية استجابة للطلب في وظيفة رد الاتصال المجهول لـ Exec () ، في حين أن معالج التحميل لا يزال يرد ببساطة على "Hello World" ، ولكن هذه المرة يستخدم كائن الاستجابة.
إذا كنت ترغب في إثبات أن عملية الاستهلاك للوقت في معالج /ابدأ لن تمنع الاستجابة الفورية لطلب /تحميل ، يمكنك تعديل requestHandlers.js إلى النموذج التالي:
نسخة الكود كما يلي:
var exec = required ("child_process"). exec ؛
وظيفة بدء (استجابة) {
console.log ("تم استدعاء معالج الطلب" Start ".") ؛
exec ("Find /" ،
{timeout: 10000 ، maxbuffer: 20000*1024} ،
وظيفة (خطأ ، stdout ، stderr) {
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
استجابة. write (stdout) ؛
استجابة.
}
) ؛
}
تحميل الوظيفة (استجابة) {
console.log ("تم استدعاء معالج الطلب" تحميل ".") ؛
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
Response.write ("Hello Upload") ؛
استجابة.
}
orports.start = start ؛
orports.upload = تحميل ؛
وبهذه الطريقة ، عند طلب http: // localhost: 8888/start ، سيستغرق التحميل 10 ثوانٍ ، وعند طلب http: // localhost: 8888/تحميل ، سوف يستجيب على الفور ، حتى إذا كانت استجابة/البدء لا تزال تتم معالجتها في هذا الوقت.