في بداية هذا العام ، خططت لإعادة كتابة برنامج المدونة الخاص بي بناءً على إطار عمل Express باستخدام Node.js ، وأقول وداعًا لـ ASP.NET من الآن فصاعدًا. ومع ذلك ، فإن VPS الذي أستخدمه حاليًا هو نظام Windows Server و IIS. إذا استمعت كل من Express و IIS إلى المنفذ 80 ، فستكون هناك صراعات واضحة. لحسن الحظ ، هناك امتداد يسمى iisnode يستضيف برامج Node.js إلى IIS. علاوة على ذلك ، بعد الاستضافة ، فإن هذا يعني أيضًا أنه يمكن استخدام وظائف مختلفة في IIS (إدارة العمليات ، ضغط GZIP ، التسجيل ، ذاكرة التخزين المؤقت ، التحكم في الإذن ، ربط اسم المجال ، إلخ).
لاستخدام iisnode ، تحتاج إلى التثبيت:
1.node.js
2. وحدة إعادة كتابة URL IIS
3.Iisnode
بعد التثبيت ، لا تزال تتبع العمليات المعتادة لإنشاء موقع في مدير IIS وتشير إلى دليل برنامج Express. المفتاح هو إضافة ملف web.config:
نسخة الكود كما يلي:
<simpion>
<styse.webserver>
<Condlers>
<add name = "iisnode" path = "bin /www" verb = "*" modules = "iisnode" resourceType = "unsperied" quireccess = "script" />
</handlers>
<rewrite>
<ruls>
<اسم القاعدة = "All">
<match url = " /*" />
<action type = "rewrite" url = "bin /www" />
</rule>
</القواعد>
</rewrite>
<system.webserver>
</configuration>
يمكن أيضًا تكوين هذا المحتوى من خلال الواجهة المرئية لمدير IIS. وهذا يعني تقريبًا إعادة كتابة جميع الطلبات إلى bin/www ، وتشغيل bin/www باستخدام امتداد iisnode. ومع ذلك ، بعد فتح الموقع ، تظهر رسالة خطأ:
نسخة الكود كما يلي:
تم تكوين وحدة مرشح الطلب لرفض المسارات في عنوان URL الذي يحتوي على قسم Hiddensegress
في البداية ، شعرت أنني لم أكن واضحًا حيال ذلك ، لكن في وقت لاحق أدركت فجأة أن دليل BIN في ASP.NET هو دليل خاص لا يُسمح بالوصول إليه. أعد كتابة الطلب إلى bin/www ، الذي يضرب هذه القاعدة. لذا ، فقط قم بتغيير اسم الدليل ، على سبيل المثال ، تغيير Bin إلى الإطلاق (اتضح أنه ليس ممارسة جيدة ، دعنا نتحدث عنها لاحقًا) ، ويجب أيضًا تعديل Web.Config وفقًا لذلك:
نسخة الكود كما يلي:
<simpion>
<styse.webserver>
<Condlers>
<add name = "iisnode" path = "launch /www" verb = "*" modules = "iisnode" resourceType = "unsperied" quireccess = "script" />
</handlers>
<rewrite>
<ruls>
<اسم القاعدة = "All">
<match url = " /*" />
<action type = "rewrite" url = "launch /www" />
</rule>
</القواعد>
</rewrite>
<system.webserver>
</configuration>
بعد إعادة تشغيل الموقع في مدير IIS ، والوصول إليه مرة أخرى ، بدأ العمل أخيرًا ، لم يكن الأمر سهلاً! لكني كنت لا أزال سعيدًا جدًا.
أثناء عملية اختبار وظيفة البرنامج ، وجد أن IP الذي تم الحصول عليه كان فارغًا. في إطار Express ، يتم الحصول على IP من خلال req.ip ، والذي بدوره يحصل على القيمة من Remote_addr من رأس الطلب. من خلال رمز اختبار بسيط ، وجد أن قيمة Remote_Addr فارغة أيضًا. من الواضح أن معلومات الرأس هذه تضيع خلال العملية من IIS إلى Node.js. بعد Google ، وجدت أن iisnode لديه هذه المشكلة. الحل الرسمي هو استخدام X-forword-for ، لكنني وجدت حلًا آخر.
يوجد تكوين في web.config (قبل إضافته إلى <system.webserver>) يمكنه الاحتفاظ بـ remote_addr:
نسخة الكود كما يلي:
<iisnode produeserverVars = "remote_addr" />
وفقًا للتعليمات ، سيتم إعادة تسمية REMOTE_ADDR المحجوزة إلى X-IISNODE-REMOTE_ADDR ، لذلك عليك الكتابة فوق قيمة req.ip مرة واحدة وإضافة وظيفة الوسيطة إلى App.js من Express:
نسخة الكود كما يلي:
app.use (function (req ، res ، next) {
req.ip = req.headers ['x-iisnode-remote_addr'] ؛
التالي()؛
}) ؛
ومع ذلك ، بعد هذا التعديل ، لا يزال IP الذي تم الحصول عليه فارغًا ، مما يجعل الناس يتساءلون حتماً عما إذا كانت مهمة REQ.IP قد فشلت. بالنظر إلى رمز المصدر لـ Express ، ستجد أن req.ip يتم تعريفه من خلال getter define ، حتى للكتابة فوقه ، عليك تحديد مرة أخرى:
نسخة الكود كما يلي:
app.use (function (req ، res ، next) {
Object.DefineProperty (req ، 'ip' ، {
get: function () {return this.headers ['x-iisnode-remote_addr'] ؛ }
}) ؛
التالي()؛
}) ؛
لقد تم حل هذه المشكلة أخيرًا ، لكن هذه ليست طريقة جيدة. سيكون الأمر مزعجًا إذا قام Express بإعداد REQ.IP للقراءة فقط في المستقبل.
مواصلة الاختبار والعثور على مشكلة أخرى. عادة ، ستقوم وظيفة تحميل الملف في خلفية المدونة بتمرير الملف إلى دليل الجمهور/التحميل ، ولكن في الواقع ، يتم إنشاء مجلد الجمهور/التحميل في دليل الإطلاق (أي دليل BIN الأصلي). في الواقع ، والسبب هو أن ملف www كمدخل للبرنامج موجود في دليل الإطلاق ، وبالتالي يصبح دليل الإطلاق دليل تنفيذ التطبيق. الحل الخاص بي هو تغيير اسم دليل الإطلاق إلى bin ، إنشاء تشغيل.
نسخة الكود كما يلي:
#!/usr/bin/env node
يتطلب ('./ bin/www') ؛
ثم قم بتغيير إدخال البرنامج إلى Launch.js:
نسخة الكود كما يلي:
<simpion>
<styse.webserver>
<Condlers>
<add name = "iisnode" path = "laffic.js" verb = "*" modules = "iisnode" resourceType = "unspifed" quistruct = "script" />
</handlers>
<rewrite>
<ruls>
<اسم القاعدة = "All">
<match url = " /*" />
<action type = "rewrite" url = "launch.js" />
</rule>
</القواعد>
</rewrite>
<iisnode produeserverVars = "remote_addr" />
<system.webserver>
</configuration>
من الواضح أن iisnode ليس منتجًا ناضجًا ، وبالطبع Node.js ليس (ليس 1.0 حتى الآن) ، كل شيء يحتاج إلى مزيد من الاستكشاف والتحسين.