حتى الآن ، لا يتمتع الخادم الذي أجريناه بأي استخدام عملي ، لذلك سنبدأ في تنفيذ بعض الوظائف العملية والمفيدة.
ما يتعين علينا القيام به هو: يحدد المستخدم ملفًا ، ويقوم بتحميل الملف ، ثم يرى الملف الذي تم تحميله في المتصفح.
أولاً ، نحتاج إلى textarea للمستخدم لإدخال المحتوى ، ثم إرساله إلى الخادم من خلال طلب البريد.
نضيف رمزًا إلى معالج الأحداث البدء ، ونعدل requestHandlers.js على النحو التالي:
نسخة الكود كما يلي:
وظيفة بدء (استجابة) {
console.log ("تم استدعاء معالج الطلب" Start ".") ؛
var body = '<html>'+ '<head>'+
"<meta http-equiv =" content-type "content =" text/html ؛ '+
"charset = utf-8" /> '+
'</head>'+
'<body>'+
'<form action = "/upload" method = "post">'+
'<textarea name = "text" rows = "20" cols = "60"> </textarea>'+
'<إدخال نوع = "إرسال" value = "إرسال النص" />'+
'</form>'+
'</body>'+
'</html>' ؛
Response.writehead (200 ، {"content-type": "text/html"}) ؛
استجابة. write (الجسم) ؛
استجابة.
}
تحميل الوظيفة (استجابة) {
console.log ("تم استدعاء معالج الطلب" تحميل ".") ؛
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
Response.write ("Hello Upload") ؛
استجابة.
}
orports.start = start ؛
orports.upload = تحميل ؛
يمكنك رؤية التأثير من خلال زيارة http: // localhost: 8888/ابدأ في متصفحك.
بعد ذلك ، نريد تنفيذ تشغيل معالج طلب /تحميل للتعامل مع طلب النشر عندما يقدم المستخدم النموذج.
لجعل العملية بأكملها غير حظر ، ستقوم Node.js بتقسيم البيانات النشر إلى العديد من كتل البيانات الصغيرة ، ثم تمرير كتل البيانات الصغيرة هذه إلى وظيفة رد الاتصال من خلال تشغيل أحداث محددة. تتضمن الأحداث المحددة هنا حدث بيانات (تشير إلى أن كتلة بيانات صغيرة جديدة قد وصلت) وحدث نهائي (يشير إلى أن جميع البيانات قد تم استلامها).
نقوم بذلك عن طريق تسجيل مستمع على كائن الطلب. يتم تمرير كائن الطلب هنا إلى وظيفة رد الاتصال على OnRequest في كل مرة يتم استلام طلب HTTP.
نضع الرمز في الخادم ونعدل server.js على النحو التالي:
نسخة الكود كما يلي:
var http = require ("http") ؛
var url = require ("url") ؛
وظيفة بدء (المسار ، مقبض) {
وظيفة onrequest (طلب ، استجابة) {
var postdata = "" ؛
var pathname = url.parse (request.url) .PathName ؛
console.log ("طلب" + pathname + "تم استلامه.") ؛
request.setEncoding ("utf8") ؛
request.addListener ("البيانات" ، الدالة (postdatachunk) {
postdata += postdatachunk ؛
console.log ("receed post data chunk '" + postdatachunk + "'.") ؛
}) ؛
request.addlistener ("end" ، function () {
الطريق (المقبض ، اسم المسار ، الاستجابة ، postdata) ؛
}) ؛
}
http.createserver (onrequest) .Listen (8888) ؛
console.log ("بدأ الخادم.") ؛
}
orports.start = start ؛
يقوم الرمز أعلاه بثلاثة أشياء: أولاً ، قمنا بتعيين تنسيق الترميز للبيانات المستلمة إلى UTF-8 ، ثم تسجيل المستمع لحدث "البيانات" لجمع كتل بيانات جديدة في كل مرة وتعيينها إلى متغير postdata. أخيرًا ، نقوم بنقل المكالمة التي تطلب المسار إلى معالج الحدث النهائي للتأكد من أنها ستطلق النار فقط عند استلام جميع البيانات وإطلاق النار مرة واحدة فقط. نقوم أيضًا بتمرير بيانات النشر لطلب الطرق ، لأن هذه البيانات سيتم استخدامها من قبل معالج الطلب.
بعد ذلك ، على صفحة /تحميل ، عرض إدخال المستخدم
دعونا نغير Router.js:
نسخة الكود كما يلي:
طريق الوظيفة (المقبض ، اسم المسار ، الاستجابة ، postdata) {
console.log ("على وشك توجيه طلب" + pathname) ؛
if (typeof handle [pathname] === 'function') {
التعامل مع [pathname] (الاستجابة ، postdata) ؛
} آخر {
console.log ("لا يوجد معالج طلب لـ" + pathname) ؛
Response.writehead (404 ، {"content-type": "text/plain"}) ؛
استجابة. write ("404 غير موجود") ؛
استجابة.
}
}
orports.route = الطريق ؛
بعد ذلك ، في requestHandlers.js ، نقوم بتضمين البيانات في استجابة طلب التحميل:
نسخة الكود كما يلي:
وظيفة بدء (استجابة ، postdata) {
console.log ("تم استدعاء معالج الطلب" Start ".") ؛
var body = '<html>'+
'<head>'+
"<meta http-equiv =" content-type "content =" text/html ؛ '+
"charset = utf-8" /> '+
'</head>'+
'<body>'+
'<form action = "/upload" method = "post">'+
'<textarea name = "text" rows = "20" cols = "60"> </textarea>'+
'<إدخال نوع = "إرسال" value = "إرسال النص" />'+
'</form>'+
'</body>'+
'</html>' ؛
Response.writehead (200 ، {"content-type": "text/html"}) ؛
استجابة. write (الجسم) ؛
استجابة.
}
تحميل الوظيفة (استجابة ، postdata) {
console.log ("تم استدعاء معالج الطلب" تحميل ".") ؛
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
Response.write ("لقد أرسلت:" + postdata) ؛
استجابة.
}
orports.start = start ؛
orports.upload = تحميل ؛
آخر شيء يجب أن نفعله هو: حاليًا نمرر الجسم بأكمله من الطلب إلى توجيه الطلب ومعالج الطلب. يجب علينا فقط تمرير بيانات النشر ، الجزء الذي يهمنا ، إلى توجيه الطلبات والطلب. في مثالنا ، ما يهمنا هو حقل النص.
يمكننا استخدام وحدة QueryString التي تم تقديمها مسبقًا لتنفيذها:
نسخة الكود كما يلي:
var QueryString = require ("QueryString") ؛
وظيفة بدء (استجابة ، postdata) {
console.log ("تم استدعاء معالج الطلب" Start ".") ؛
var body = '<html>'+
'<head>'+
"<meta http-equiv =" content-type "content =" text/html ؛ '+
"charset = utf-8" /> '+
'</head>'+
'<body>'+
'<form action = "/upload" method = "post">'+
'<textarea name = "text" rows = "20" cols = "60"> </textarea>'+
'<إدخال نوع = "إرسال" value = "إرسال النص" />'+
'</form>'+
'</body>'+
'</html>' ؛
Response.writehead (200 ، {"content-type": "text/html"}) ؛
استجابة. write (الجسم) ؛
استجابة.
}
تحميل الوظيفة (استجابة ، postdata) {
console.log ("تم استدعاء معالج الطلب" تحميل ".") ؛
Response.writehead (200 ، {"content-type": "text/plain"}) ؛
Response.write ("لقد أرسلت النص:"+ QueryString.parse (postdata) .text) ؛
استجابة.
}
orports.start = start ؛
orports.upload = تحميل ؛
حسنًا ، ما ورد أعلاه هو كل شيء عن معالجة بيانات النشر.
في القسم التالي ، سنقوم بتنفيذ وظيفة تحميل الصور.