Wir möchten das Antwortobjekt (erhalten von der Rückruffunktion onRequest() des Servers) über die Anforderungsroute an den Anforderungshandler übergeben. Der Handler kann dann auf die Anfrage antworten, indem er Funktionen für dieses Objekt verwendet.
Nehmen wir zunächst Änderungen an server.js vor:
var http = require("http");
var url = require("url");
Funktion start(route, handle) {
Funktion onRequest(Anfrage, Antwort) {
var pathname = url.parse(request.url).pathname;
console.log("Anfrage für "Pfadname" erhalten.");
Route(Handle, Pfadname, Antwort);
}
http.createServer(onRequest).listen(8888);
console.log("Server wurde gestartet.");
}
exports.start = start;
Wir übergeben das Antwortobjekt als dritten Parameter an die Route()-Funktion und entfernen alle antwortbezogenen Funktionsaufrufe im onRequest()-Handler, da wir möchten, dass dieser Teil der Arbeit von der Route( )-Funktion zum Abschließen.
Als nächstes ändern Sie router.js:
Funktion Route(Handle, Pfadname, Antwort) {
console.log("Im Begriff, eine Anfrage für "Pfadname) weiterzuleiten);
if (typeof handle[pathname] === 'function') {
handle[Pfadname](Antwort);
} sonst {
console.log("Kein Anforderungshandler für "Pfadname gefunden);
Response.writeHead(404, {"Content-Type": "text/plain"});
Response.write("404 Nicht gefunden");
Response.end();
}
}
exports.route = route;
Gleiches Muster: Anstatt den Rückgabewert vom Anforderungshandler abzurufen, wird das Antwortobjekt dieses Mal direkt übergeben. Wenn kein entsprechender Anforderungsprozessor zur Verarbeitung vorhanden ist, geben wir direkt einen Fehler „404“ zurück.
Als nächstes ändern Sie requestHandler.js:
var exec = require("child_process").exec;
Funktionsstart (Antwort) {
console.log("Der Anforderungshandler 'start' wurde aufgerufen.");
exec("ls -lah", function (error, stdout, stderr) {
Response.writeHead(200, {"Content-Type": "text/plain"});
Response.write(stdout);
Response.end();
});
}
Funktions-Upload (Antwort) {
console.log("Der Anforderungshandler 'upload' wurde aufgerufen.");
Response.writeHead(200, {"Content-Type": "text/plain"});
Response.write("Hallo Upload");
Response.end();
}
exports.start = start;
exports.upload = hochladen;
Unsere Handlerfunktion muss den Antwortparameter empfangen, um direkt auf die Anfrage antworten zu können. Der Start-Handler führt die Anfrage-Antwort-Operation in der anonymen Rückruffunktion von exec() aus, während der Upload-Handler immer noch einfach „Hallo Welt“ antwortet, dieses Mal jedoch das Antwortobjekt verwendet.
Wenn Sie nachweisen möchten, dass die zeitaufwändigen Vorgänge im /start-Handler die unmittelbare Antwort auf die /upload-Anfrage nicht blockieren, können Sie requestHandlers.js in die folgende Form ändern:
var exec = require("child_process").exec;
Funktionsstart (Antwort) {
console.log("Der Anforderungshandler 'start' wurde aufgerufen.");
exec("find /",
{ timeout: 10000, maxBuffer: 20000*1024 },
Funktion (error, stdout, stderr) {
Response.writeHead(200, {"Content-Type": "text/plain"});
Response.write(stdout);
Response.end();
}
);
}
Funktions-Upload (Antwort) {
console.log("Der Anforderungshandler 'upload' wurde aufgerufen.");
Response.writeHead(200, {"Content-Type": "text/plain"});
Response.write("Hallo Upload");
Response.end();
}
exports.start = start;
exports.upload = hochladen;
Auf diese Weise dauert das Laden bei der Anfrage von http://localhost:8888/start 10 Sekunden, bei der Anfrage von http://localhost:8888/upload antwortet es jedoch sofort, auch wenn /start Die Antwort wird derzeit noch bearbeitet.