Queremos pasar el objeto de respuesta (obtener de la función de devolución de llamada del servidor OnRequest ()) al controlador de solicitudes a través del enrutamiento de solicitudes. El controlador puede usar las funciones en el objeto para responder a la solicitud.
Hagamos los cambios en server.js primero:
La copia del código es la siguiente:
var http = require ("http");
var url = require ("url");
Function Start (Route, Handle) {
function OnRequest (solicitud, respuesta) {
var rathName = url.Parse (request.url) .pathname;
console.log ("Solicitar" + PathName + "Recibido");
ruta (manejo, ruta, respuesta);
}
http.createServer (OnRequest) .listen (8888);
console.log ("El servidor ha comenzado");
}
exports.start = inicio;
Pasamos el objeto de respuesta como el tercer parámetro a la función Route (), y eliminamos toda la llamada de respuesta en el controlador OnRequest () porque queremos que esta parte del trabajo permita que la función Route () se complete.
A continuación, modifique Router.js:
La copia del código es la siguiente:
ruta de funciones (Handle, rathname, respuesta) {
console.log ("a punto de enrutar una solicitud para" + rathName);
if (typeof mango [pathname] === 'function') {
manejar [PathName] (respuesta);
} demás {
console.log ("No se encontró controlador de solicitud para" + PathName);
Response.Writehead (404, {"Content-type": "Text/Plain"});
respuesta.write ("404 no encontrado");
respuesta.end ();
}
}
exports.route = ruta;
El mismo patrón: en comparación con la adquisición anterior del valor de retorno del controlador de solicitud, este tiempo, en su lugar, se pasa directamente del objeto de respuesta. Si no hay un procesador de solicitud correspondiente para manejarlo, devolveremos directamente el error "404".
A continuación, modifique requesthandler.js:
La copia del código es la siguiente:
var exec = require ("child_process"). Exec;
Function Start (Respuesta) {
console.log (se llamó al controlador de solicitud 'Inicio'. ");
exec ("ls -lah", function (error, stdout, stderr) {
Response.Writehead (200, {"Content-type": "Text/Plain"});
Response.write (stdout);
respuesta.end ();
});
}
Función cargada (respuesta) {
console.log ("Solicitar el controlador 'Subiendo' se llamó.");
Response.Writehead (200, {"Content-type": "Text/Plain"});
Response.write ("Hola, carga");
respuesta.end ();
}
exports.start = inicio;
exports.upload = cargar;
Nuestra función de controlador debe recibir el parámetro de respuesta para responder directamente a la solicitud. El controlador de inicio realiza una operación de respuesta de solicitud en la función anónima de devolución de llamada de Exec (), mientras que el controlador de carga todavía simplemente responde a "Hello World", pero esta vez está utilizando el objeto de respuesta.
Si desea demostrar que la operación que requiere mucho tiempo en el controlador /Start no bloqueará la respuesta inmediata a la solicitud /carga de carga, puede modificar SoldHandlers.js al siguiente formulario:
La copia del código es la siguiente:
var exec = require ("child_process"). Exec;
Function Start (Respuesta) {
console.log (se llamó al controlador de solicitud 'Inicio'. ");
ejecutora ("find /",
{Tiempo de espera: 10000, Maxbuffer: 20000*1024},
función (error, stdout, stderr) {
Response.Writehead (200, {"Content-type": "Text/Plain"});
Response.write (stdout);
respuesta.end ();
}
);
}
Función cargada (respuesta) {
console.log ("Solicitar el controlador 'Subiendo' se llamó.");
Response.Writehead (200, {"Content-type": "Text/Plain"});
Response.write ("Hola, carga");
respuesta.end ();
}
exports.start = inicio;
exports.upload = cargar;
De esta manera, al solicitar http: // localhost: 8888/inicio, tardará 10 segundos en cargarse, y al solicitar http: // localhost: 8888/upload, responderá de inmediato, incluso si la respuesta/inicio aún se está procesando en este momento.