Pada awal tahun ini, saya berencana untuk menulis ulang program blog saya berdasarkan kerangka kerja Express menggunakan Node.js, dan mengucapkan selamat tinggal kepada ASP.NET mulai sekarang. Namun, VPS yang saya gunakan saat ini adalah Windows Server System dan IIS Server. Jika Express dan II keduanya mendengarkan Port 80, akan ada konflik yang jelas. Untungnya, ada ekstensi yang disebut IISNode yang meng -host program Node.js ke IIS. Selain itu, setelah hosting, itu juga berarti bahwa berbagai fungsi di IIS dapat digunakan (manajemen proses, kompresi GZIP, logging, cache, kontrol izin, pengikatan nama domain, dll.).
Untuk menggunakan IISNode, Anda perlu menginstal:
1.node.js
2. IIS URL Menulis ulang modul
3.iisnode
Setelah instalasi, Anda masih mengikuti operasi yang biasa untuk membuat situs di IIS Manager dan menunjuk ke direktori program Express. Kuncinya adalah menambahkan file web.config:
Salinan kode adalah sebagai berikut:
<Configuration>
<system.webserver>
<shandlers>
<Tambah nama = "iisnode" path = "bin /www" verb = "*" modul = "iisnode" resourcetype = "tidak ditentukan" nettereAccess = "script" />
</handlers>
<write ulang>
<Rules>
<aturan nama = "semua">
<cocokkan url = " /*" />
<Tipe Action = "Tulis ulang" url = "bin /www" />
</aturan>
</aturan>
</brite>
</system.webserver>
</configuration>
Konten ini juga dapat dikonfigurasi melalui antarmuka visual Manajer IIS. Secara kasar berarti menulis ulang semua permintaan ke bin/www, dan menjalankan bin/www menggunakan ekstensi IISNode. Namun, setelah membuka situs, pesan kesalahan muncul:
Salinan kode adalah sebagai berikut:
Modul Filter Permintaan dikonfigurasi untuk menolak jalur di URL yang berisi bagian Hiddensment
Pada awalnya saya merasa bahwa saya tidak jelas tentang hal itu, tetapi kemudian saya tiba -tiba menyadari bahwa direktori nampan di ASP.NET adalah direktori khusus yang tidak diizinkan diakses. Tulis ulang permintaan ke bin/www, yang mengenai aturan ini. Jadi, ubah saja nama direktori, misalnya, ubah tempat sampah untuk diluncurkan (ternyata bukan praktik yang baik, mari kita bicarakan nanti), dan web.config juga perlu disesuaikan sesuai:
Salinan kode adalah sebagai berikut:
<Configuration>
<system.webserver>
<shandlers>
<Tambah nama = "iisnode" path = "luncurkan /www" verb = "*" modul = "iiSnode" resourcetype = "tidak ditentukan" nettereAccess = "script" />
</handlers>
<write ulang>
<Rules>
<aturan nama = "semua">
<cocokkan url = " /*" />
<Action type = "recerite" url = "luncur /www" />
</aturan>
</aturan>
</brite>
</system.webserver>
</configuration>
Setelah memulai kembali situs di IIS Manager, mengaksesnya lagi, akhirnya mulai berjalan, itu tidak mudah! Tapi saya masih terlalu senang.
Selama proses pengujian fungsi program, ditemukan bahwa IP yang diperoleh kosong. Dalam kerangka kerja Express, IP diperoleh melalui req.ip, yang pada gilirannya memperoleh nilai dari remote_addr dari header permintaan. Melalui kode uji sederhana, ditemukan bahwa nilai Remote_Addr juga kosong. Jelas bahwa informasi header ini hilang selama proses dari IIS ke Node.js. Setelah Google, saya menemukan bahwa IISNode memang memiliki masalah ini. Solusi resmi adalah menggunakan x-forword-for, tetapi saya menemukan solusi lain.
Ada konfigurasi di web.config (sebelum menambahkannya ke </system.webserver>) yang dapat mempertahankan jarak jauh_addr:
Salinan kode adalah sebagai berikut:
<iisnode promeserVars = "remote_addr" />
Menurut instruksi, Remote_Addr yang dipesan akan diubah namanya menjadi X-IISNode-Remote_Addr, jadi Anda harus menimpa nilai req.ip sekali dan menambahkan fungsi middleware ke app.js ekspres:
Salinan kode adalah sebagai berikut:
app.use (function (req, res, next) {
req.ip = req.headers ['x-iisnode-remote_addr'];
Berikutnya();
});
Namun, setelah penyesuaian ini, IP yang diperoleh masih kosong, yang mau tidak mau membuat orang bertanya -tanya apakah penugasan req.ip telah gagal. Melihat Kode Sumber Express, Anda akan menemukan bahwa Req.ip didefinisikan melalui Define Getter, jadi untuk menimpanya, Anda harus mendefinisikan lagi:
Salinan kode adalah sebagai berikut:
app.use (function (req, res, next) {
Object.defineproperty (req, 'ip', {
get: function () {return this.headers ['x-iisnode-remote_addr']; }
});
Berikutnya();
});
Masalah ini akhirnya diselesaikan, tetapi ini bukan metode yang baik. Ini akan merepotkan jika set ekspres req.ip untuk membaca saja di masa depan.
Lanjutkan menguji dan temukan masalah lain. Biasanya, fungsi unggahan file di latar belakang blog akan meneruskan file ke direktori publik/unggah, tetapi pada kenyataannya, folder publik/unggah dihasilkan di direktori peluncuran (yaitu, direktori bin asli). Faktanya, alasannya adalah bahwa file WWW sebagai pintu masuk program ada di direktori peluncuran, sehingga direktori peluncuran menjadi direktori eksekusi aplikasi. Solusi saya adalah mengubah nama direktori peluncuran kembali ke bin, membuat peluncuran.js di direktori root untuk memanggil bin/www:
Salinan kode adalah sebagai berikut:
#!/USR/BIN/Env node
membutuhkan ('./ bin/www');
Kemudian ubah entri program ke Launch.js:
Salinan kode adalah sebagai berikut:
<Configuration>
<system.webserver>
<shandlers>
<Tambah nama = "iisnode" path = "launch.js" verb = "*" modul = "iisnode" resourcetype = "tidak ditentukan" nettereAccess = "script" />
</handlers>
<write ulang>
<Rules>
<aturan nama = "semua">
<cocokkan url = " /*" />
<Action type = "tulis ulang" url = "launch.js" />
</aturan>
</aturan>
</brite>
<iisnode promeserVars = "remote_addr" />
</system.webserver>
</configuration>
Jelas, IISNode bukan produk yang matang, dan tentu saja node.js belum (belum 1.0), semuanya membutuhkan eksplorasi dan peningkatan lebih lanjut.