Мы хотим передать объект ответа (Get от функции обратного вызова сервера OnRequest ()) к обработчику запроса через маршрутизацию запроса. Затем обработчик может использовать функции в объекте, чтобы ответить на запрос.
Сначала внесем изменения в Server.js:
Кода -копия выглядит следующим образом:
var http = require ("http");
var url = require ("url");
Function Start (маршрут, ручка) {
функция OnRequest (запрос, ответ) {
var pathname = url.parse (request.url) .pathname;
console.log ("запрос на" + pathname + "получен.");
маршрут (ручка, pathname, ответ);
}
http.createserver (onrequest) .listen (8888);
console.log («Сервер начался»);
}
exports.start = start;
Мы передаем объект ответа в качестве третьего параметра в функцию route () и удаляем все вызовы ответа в обработчике OnRequest (), потому что мы хотим, чтобы эта часть работы завершила функцию route ().
Далее, изменить router.js:
Кода -копия выглядит следующим образом:
маршрут функции (ручка, pathname, response) {
console.log ("ate to Mraking запрос на" + pathname);
if (typeof handle [pathname] === 'function') {
ручка [pathname] (ответ);
} еще {
console.log («Обработчик запроса не найден для» + pathname);
response.writehead (404, {"content-type": "text/plain"});
response.write («404 не найден»);
response.end ();
}
}
exports.route = route;
Та же схема: по сравнению с предыдущим приобретением возвращаемого значения от обработчика запроса, на этот раз он напрямую передается объекту ответа. Если нет соответствующего процессора запроса для его обработки, мы напрямую вернем ошибку «404».
Далее измените requestHandler.js:
Кода -копия выглядит следующим образом:
var exec = require ("child_process"). Exec;
Функция запуска (ответ) {
console.log ("запрос обработчика" был вызван.
exec ("ls -lah", функция (ошибка, stdout, stderr) {
response.writehead (200, {"content-type": "text/plain"});
response.write (stdout);
response.end ();
});
}
функция загрузка (ответ) {
console.log («обработчик запроса» был вызван загрузкой '. »);
response.writehead (200, {"content-type": "text/plain"});
response.write ("Привет, загрузка");
response.end ();
}
exports.start = start;
exports.upload = upload;
Наша функция обработчика должна получить параметр ответа, чтобы непосредственно ответить на запрос. Групп старта выполняет операцию ответа на запрос в функции анонимного обратного вызова exec (), в то время как обработчик загрузки все еще просто отвечает на «Hello World», но на этот раз он использует объект ответа.
Если вы хотите доказать, что трудоемкая операция в обработчике /старт не заблокирует непосредственный ответ на запрос /upload, вы можете изменить requestHandlers.js в следующую форму:
Кода -копия выглядит следующим образом:
var exec = require ("child_process"). Exec;
Функция запуска (ответ) {
console.log ("запрос обработчика" был вызван.
exec ("find /",
{Timeout: 10000, MaxBuffer: 20000*1024},
функция (ошибка, stdout, stderr) {
response.writehead (200, {"content-type": "text/plain"});
response.write (stdout);
response.end ();
}
);
}
функция загрузка (ответ) {
console.log («обработчик запроса» был вызван загрузкой '. »);
response.writehead (200, {"content-type": "text/plain"});
response.write ("Привет, загрузка");
response.end ();
}
exports.start = start;
exports.upload = upload;
Таким образом, при запросе http: // localhost: 8888/start, для загрузки потребуется 10 секунд, а при запросе http: // localhost: 8888/upload он ответит немедленно, даже если ответ/старт все еще будет обрабатывается в настоящее время.