Heim  >  Artikel  >  Web-Frontend  >  Erstellen Sie ganz einfach einen NodeJS-Server (8): So erreichen Sie Nicht-Blockierung_node.js

Erstellen Sie ganz einfach einen NodeJS-Server (8): So erreichen Sie Nicht-Blockierung_node.js

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

In diesem Abschnitt werfen wir einen Blick darauf, wie nodejs nicht blockierende Vorgänge implementiert.

Ändern wir zuerst den Starthandler:

Code kopieren Der Code lautet wie folgt:

var exec = require("child_process").exec;
Funktion start() {
console.log("Der Anforderungshandler 'start' wurde aufgerufen.");
var content = "empty";
exec("ls -lah", function (error, stdout, stderr) {
content = stdout;
});
Inhalt zurückgeben;
}

Funktion upload() {
console.log("Der Anforderungshandler 'upload' wurde aufgerufen.");
Geben Sie „Hallo Upload“ zurück;
}

exports.start = start;
exports.upload = hochladen;

Dieser Code erstellt einen neuen Variableninhalt (Anfangswert ist „leer“), führt den Befehl „ls -lah“ aus, weist das Ergebnis dem Inhalt zu und gibt schließlich den Inhalt zurück.

Wir haben ein neues Node.js-Modul eingeführt, child_process. Der Grund, warum wir es verwenden, ist die Implementierung einer einfachen und praktischen nicht blockierenden Operation: exec().

Was macht exec()?

Es führt einen Shell-Befehl von Node.js aus. Im obigen Beispiel verwenden wir es, um alle Dateien im aktuellen Verzeichnis abzurufen („ls -lah“) und geben dann die Dateiinformationen an den Browser aus, wenn /startURL angefordert wird.

Wir starten den Server und besuchen „http://localhost:8888/start“ und stellen fest, dass der Ausgabeinhalt der Seite leer ist.

exec() kommt ins Spiel. Damit können wir sehr zeitaufwändige Shell-Operationen ausführen, ohne unsere Anwendung dazu zu zwingen, anzuhalten und auf die Operation zu warten.

Trotzdem scheint der von der Seite ausgegebene Inhalt nicht das gewünschte Ergebnis zu sein.

Lassen Sie uns die Gründe analysieren:

Unser Code wird synchron ausgeführt, was bedeutet, dass Node.js nach dem Aufruf von exec() den Rückgabeinhalt sofort ausführt

Zu diesem Zeitpunkt ist der Inhalt noch „leer“, da die an exec() übergebene Callback-Funktion noch nicht ausgeführt wurde – da die Operation von exec() asynchron ist.

Im nächsten Abschnitt stellen wir vor, wie Sie dieses Problem lösen können.

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