Kami ingin meneruskan objek respons (dapatkan dari fungsi panggilan balik server OnRequest ()) ke penangan permintaan melalui perutean permintaan. Penangan kemudian dapat menggunakan fungsi pada objek untuk menanggapi permintaan.
Mari kita lakukan perubahan pada server.js terlebih dahulu:
Salinan kode adalah sebagai berikut:
var http = membutuhkan ("http");
var url = membutuhkan ("url");
fungsi start (rute, handle) {
function onRequest (request, response) {
var pathname = url.parse (request.url) .pathname;
Console.log ("Permintaan" + Pathname + "Diterima.");
rute (pegangan, pathname, respons);
}
http.createServer (onRequest) .listen (8888);
Console.log ("Server telah dimulai.");
}
Exports.start = Mulai;
Kami meneruskan objek respons sebagai parameter ketiga ke fungsi route (), dan kami menghapus semua panggilan respons di pawang onRequest () karena kami ingin bagian pekerjaan ini untuk membiarkan fungsi rute () selesai.
Selanjutnya, ubah router.js:
Salinan kode adalah sebagai berikut:
rute fungsi (pegangan, pathname, respons) {
console.log ("Akan merutekan permintaan untuk" + pathname);
if (typeof handle [pathname] === 'function') {
menangani [pathname] (respons);
} kalau tidak {
console.log ("Tidak ada penangan permintaan yang ditemukan untuk" + pathname);
response.writeHead (404, {"tipe konten": "teks/polos"});
response.write ("404 tidak ditemukan");
response.end ();
}
}
Exports.Route = rute;
Pola yang sama: Dibandingkan dengan akuisisi sebelumnya dari nilai pengembalian dari penangan permintaan, kali ini, ia secara langsung melewati objek respons. Jika tidak ada prosesor permintaan yang sesuai untuk menanganinya, kami akan langsung mengembalikan kesalahan "404".
Berikutnya, ubah requesthandler.js:
Salinan kode adalah sebagai berikut:
var exec = membutuhkan ("child_process"). exec;
fungsi start (response) {
console.log ("permintaan pawang 'start' dipanggil.");
exec ("ls -lah", function (error, stdout, stderr) {
response.writeHead (200, {"tipe konten": "teks/polos"});
response.write (stdout);
response.end ();
});
}
unggah fungsi (respons) {
console.log ("unggahan unggahan 'pawang' dipanggil.");
response.writeHead (200, {"tipe konten": "teks/polos"});
response.write ("Hello unggah");
response.end ();
}
Exports.start = Mulai;
Exports.upload = unggah;
Fungsi penangan kami perlu menerima parameter respons untuk menanggapi langsung permintaan. Start Handler melakukan operasi respons permintaan dalam fungsi panggilan balik anonim EXEC (), sementara penangan unggahan masih hanya membalas ke "Hello World", tetapi kali ini menggunakan objek respons.
Jika Anda ingin membuktikan bahwa operasi yang memakan waktu di handler /start tidak akan memblokir respons langsung ke permintaan /unggah, Anda dapat memodifikasi requesthandlers.js ke formulir berikut:
Salinan kode adalah sebagai berikut:
var exec = membutuhkan ("child_process"). exec;
fungsi start (response) {
console.log ("permintaan pawang 'start' dipanggil.");
exec ("find /",
{Timeout: 10000, MaxBuffer: 20000*1024},
function (error, stdout, stderr) {
response.writeHead (200, {"tipe konten": "teks/polos"});
response.write (stdout);
response.end ();
}
);
}
unggah fungsi (respons) {
console.log ("unggahan unggahan 'pawang' dipanggil.");
response.writeHead (200, {"tipe konten": "teks/polos"});
response.write ("Hello unggah");
response.end ();
}
Exports.start = Mulai;
Exports.upload = unggah;
Dengan cara ini, ketika meminta http: // localhost: 8888/start, dibutuhkan 10 detik untuk memuat, dan ketika meminta http: // localhost: 8888/mengunggah, itu akan segera merespons, bahkan jika respons/start masih diproses saat ini.