Queremos passar o objeto de resposta (obtenha da função de retorno de chamada do servidor onRequest ()) para o manipulador de solicitação através do roteamento da solicitação. O manipulador pode usar as funções no objeto para responder à solicitação.
Vamos fazer alterações no server.js primeiro:
A cópia do código é a seguinte:
var http = requer ("http");
var url = requer ("url");
Função Iniciar (Rota, Handle) {
função onRequest (solicitação, resposta) {
var pathname = url.parse (request.url) .pathname;
console.log ("Solicitação de" + Pathname + "Recebido.");
rota (alça, nome do caminho, resposta);
}
http.createServer (onRequest) .Listen (8888);
console.log ("O servidor começou");
}
exports.start = start;
Passamos o objeto de resposta como o terceiro parâmetro para a função rota () e removemos toda a chamada de resposta no manipulador onRequest () porque queremos que essa parte do trabalho permita que a função rota () seja concluída.
Em seguida, modifique o Router.js:
A cópia do código é a seguinte:
Rota da função (identificador, nome do caminho, resposta) {
console.log ("prestes a rotear uma solicitação de" + pathname);
if (typeof handle [pathname] === 'function') {
Handle [Pathname] (resposta);
} outro {
console.log ("Nenhum manipulador de solicitação encontrado para" + pathname);
Response.WriteHead (404, {"content-type": "text/plana"});
resposta.write ("404 não encontrado");
resposta.END ();
}
}
exports.Route = rota;
O mesmo padrão: comparado à aquisição anterior do valor de retorno do manipulador de solicitação, desta vez, ele é passado diretamente no objeto de resposta. Se não houver processador de solicitação correspondente para lidar com isso, retornaremos diretamente o erro "404".
Em seguida, modifique requesthandler.js:
A cópia do código é a seguinte:
var Exec = requer ("Child_Process"). Exec;
função start (resposta) {
console.log ("Solicitação Handler 'Start' foi chamado.");
exec ("ls -lah", função (erro, stdout, stderr) {
Response.writehead (200, {"content-type": "text/plana"});
resposta.write (stdout);
resposta.END ();
});
}
função upload (resposta) {
console.log ("O manipulador de solicitação 'upload' foi chamado.");
Response.writehead (200, {"content-type": "text/plana"});
Response.Write ("Hello upload");
resposta.END ();
}
exports.start = start;
exports.upload = upload;
Nossa função manipuladora precisa receber o parâmetro de resposta para responder diretamente à solicitação. O manipulador de partida executa uma operação de resposta de solicitação na função anônima de retorno de chamada do EXEC (), enquanto o manipulador de upload ainda está simplesmente respondendo ao "Hello World", mas desta vez ele está usando o objeto de resposta.
Se você deseja provar que a operação demorada no manipulador /start não bloqueará a resposta imediata à solicitação /upload, você pode modificar o requestHandlers.js para o seguinte formulário:
A cópia do código é a seguinte:
var Exec = requer ("Child_Process"). Exec;
função start (resposta) {
console.log ("Solicitação Handler 'Start' foi chamado.");
exec ("encontre /",
{Timeout: 10000, MaxBuffer: 20000*1024},
função (erro, stdout, stderr) {
Response.writehead (200, {"content-type": "text/plana"});
resposta.write (stdout);
resposta.END ();
}
);
}
função upload (resposta) {
console.log ("O manipulador de solicitação 'upload' foi chamado.");
Response.writehead (200, {"content-type": "text/plana"});
Response.Write ("Hello upload");
resposta.END ();
}
exports.start = start;
exports.upload = upload;
Dessa forma, ao solicitar http: // localhost: 8888/Iniciar, levará 10 segundos para carregar e, ao solicitar http: // localhost: 8888/upload, ele responderá imediatamente, mesmo que a resposta/iniciar a resposta ainda esteja sendo processada neste momento.