Heim  >  Artikel  >  Web-Frontend  >  Erstellen Sie ganz einfach einen NodeJS-Server (9): Implementieren Sie nicht blockierende Operations_node.js

Erstellen Sie ganz einfach einen NodeJS-Server (9): Implementieren Sie nicht blockierende Operations_node.js

WBOY
WBOYOriginal
2016-05-16 16:25:521391Durchsuche

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:

Code kopieren Der Code lautet wie folgt:

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:

Code kopieren Der Code lautet wie folgt:

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:

Code kopieren Der Code lautet wie folgt:

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:

Code kopieren Der Code lautet wie folgt:

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn