Heim  >  Artikel  >  Web-Frontend  >  Serverseitige JavaScript-Programmierung mit node.js

Serverseitige JavaScript-Programmierung mit node.js

高洛峰
高洛峰Original
2016-11-26 13:16:351079Durchsuche

Einfach ausgedrückt ist node.js ein Framework, das es Entwicklern ermöglicht, serverseitigen Code mithilfe der JavaScript-Sprache zu schreiben. Mit anderen Worten: Der geschriebene JavaScript-Code kann direkt auf dem lokalen Computer ausgeführt werden, nicht nur im Browser. Aus Implementierungssicht verwenden sowohl Jaxer als auch node.js vorhandene JavaScript-Ausführungs-Engines. Jaxer verwendet die in Mozilla Firefox verwendete JavaScript-Engine, während node.js die in Google Chrome verwendete V8-Engine verwendet.

Erste Schritte mit node.js

node.js kann auf gängigen Betriebssystemen wie Linux, Windows und Macintosh ausgeführt werden. Wenn Sie node.js auf der Windows-Plattform ausführen, benötigen Sie die Unterstützung von Cygwin oder MinGW. Im Folgenden wird zur Veranschaulichung die häufig verwendete Windows-Plattform als Beispiel verwendet. Zuerst müssen Sie Cygwin installieren. Bei der Installation müssen Sie die Pakete gcc-g++, make, openssl und python auswählen. Die Version von gcc muss die neueste sein. Laden Sie dann den Quellcode von node.js Version 0.4.0 von der unter Ressourcen angegebenen Adresse herunter. Führen Sie nach dem Herunterladen und Dekomprimieren Befehle wie ./configure, make und make install in Cygwin aus, um zu kompilieren und zu installieren. Führen Sie nach Abschluss der Installation den Knotenbefehl direkt aus, um die von node.js bereitgestellte Befehlszeile zu starten. JavaScript-Code kann direkt in die Befehlszeile eingegeben und ausgeführt werden. Sie können auch eine JavaScript-Datei server.js über den Knoten server.js ausführen.

Ein Beispiel für ein einfaches „Hello World“-Programm finden Sie in Code Listing 1. Nachdem die JavaScript-Datei über den Knoten helloworld.js ausgeführt wurde, wird „Hello World“ auf der Konsole ausgegeben.


Listing 1. „Hello World“-Programm mit node.js
process.stdout.write("Hello World");

Prozessdarstellung in Code-Listing 1 ist die Der aktuell ausgeführte node.js-Prozess und sein Attribut stdout stellen den Standardausgabestream des Prozesses dar. Schreiben Sie mit der Methode write() eine Zeichenfolge in den Stream. Wie Sie Codelisting 1 entnehmen können, können Sie mit JavaScript auf Ressourcen auf dem lokalen System zugreifen, beispielsweise auf den Standardausgabestream. Dies spiegelt einerseits die Leistungsfähigkeit von node.js wider.

In JavaScript-Code, der von node.js ausgeführt werden kann, können Sie einige globale Objekte verwenden: einschließlich des in Codelisting 1 verwendeten Prozesses, der unten vorgestellten require()-Methode zum Laden von Modulen und des aktuellen __filename von der Name der ausgeführten JavaScript-Datei, __dirname gibt das Verzeichnis der aktuell ausgeführten JavaScript-Datei an und die Methoden setTimeout() und setInterval() ähneln denen, die in Browsern zum Ausführen geplanter Aufgaben verwendet werden.

Nachdem die Grundkenntnisse von node.js vorgestellt wurden, wird im Folgenden die modulare Struktur von node.js vorgestellt.

Zurück nach oben

Modularer Aufbau

node.js verwendet das von CommonJS definierte Modulsystem. Verschiedene Funktionskomponenten sind in verschiedene Module unterteilt. Anwendungen können je nach Bedarf geeignete Module verwenden. Jedes Modul stellt einige öffentliche Methoden oder Eigenschaften bereit. Modulbenutzer können diese Methoden oder Eigenschaften direkt verwenden, ohne sich um die Implementierungsdetails innerhalb des Moduls kümmern zu müssen. Zusätzlich zu den vom System voreingestellten mehreren Modulen kann das Anwendungsentwicklungsteam diesen Mechanismus auch nutzen, um die Anwendung in mehrere Module aufzuteilen und so die Wiederverwendbarkeit des Codes zu verbessern.

Module verwenden

Die Verwendung eines Moduls in node.js ist sehr einfach. Bevor Sie ein Modul verwenden, müssen Sie seine Abhängigkeit von ihm deklarieren. Sie können die globale Funktion require() direkt im JavaScript-Code verwenden, um ein Modul zu laden. Beispielsweise kann require("http") das voreingestellte http-Modul des Systems laden. Und require("./myModule.js") wird verwendet, um das Modul myModule.js in dasselbe Verzeichnis wie die aktuelle JavaScript-Datei zu laden. Wenn der Pfad, der require() verwendet, mit „/“ beginnt, wird er als absoluter Pfad der Modul-JavaScript-Datei auf dem Betriebssystem betrachtet. Wenn beides nicht der Fall ist, versucht node.js, im Verzeichnis node_modules unter dem übergeordneten Verzeichnis der aktuellen JavaScript-Datei und ihren Vorgängerverzeichnissen zu suchen. Wenn beispielsweise require("other.js") im Verzeichnis /usr/home/my.js aufgerufen wird, versucht node.js, die folgenden Dateien der Reihe nach zu finden: /usr/home/node_modules/other.js, /usr/node_modules/other .js und /node_modules/other.js. Der Rückgabewert der

require()-Methode ist das vom Modul bereitgestellte öffentliche JavaScript-Objekt, das verfügbare Methoden und Eigenschaften enthält. Codelisting 2 zeigt die grundlegende Verwendung des Moduls.


Listing 2. Grundlegende Verwendung des Moduls
var Greetings = require("./greetings.js");
var msg = Greetings.sayHello("Alex", "zh_CN ");
process.stdout.write(msg);

Wie in Codeauflistung 2 gezeigt, wird der Rückgabewert der require()-Methode im Allgemeinen einer Variablen zugewiesen und direkt im JavaScript-Code verwendet Dies Variable reicht aus. Das Modul Greetings.js stellt eine sayHello()-Methode bereit, die direkt vom aktuellen JavaScript-Code verwendet wird.

Entwickeln Sie Ihre eigenen Module

Die grundlegende Arbeit bei der Entwicklung eines eigenen Moduls besteht darin, den modulbezogenen Code in die dem Modul entsprechende JavaScript-Datei zu schreiben. Dies kapselt die interne Verarbeitungslogik des Moduls. Im Allgemeinen stellt ein Modul seinen Benutzern einige öffentliche Methoden oder Eigenschaften zur Verfügung. Der interne Code des Moduls muss diese Methoden oder Eigenschaften verfügbar machen. Listing 3 zeigt den Inhalt der in Listing 2 verwendeten Datei Greetings.js.


Listing 3. Inhalt des Greetings.js-Moduls
var language ​​= {
"zh_CN" : "Hallo,",
"en" : "Hallo, "
};
exports.sayHello = function(name, language) {
return states[sprache] || sprachen["en"] + name;

Such als Code Wie in Listing 3 gezeigt, handelt es sich bei den Inhalten des exports-Objekts um die Inhalte, die im Rückgabewert des Modulbenutzers enthalten sind, der die Methode require() aufruft. Auf diese Weise deklariert ein Modul die öffentlichen Methoden und Eigenschaften, die es offenlegt. In einem Modul definierte Variablen, beispielsweise Sprachen, sind nur für Code innerhalb des Moduls sichtbar.

Wenn ein Modul viele Inhalte enthält, kann es auch in Ordnern organisiert werden. Sie können im Stammverzeichnis des Ordners eine package.json-Datei erstellen, deren Inhalt den Namen des Moduls und den Pfad zur JavaScript-Eintragsdatei enthält. Wenn diese package.json-Datei nicht bereitgestellt wird, sucht node.js standardmäßig nach der index.js-Datei im Ordner als Start-JavaScript-Datei des Moduls.

Nachdem wir die modulare Struktur von node.js vorgestellt haben, stellen wir nun seinen ereignisgesteuerten Mechanismus vor.

Zurück nach oben

Ereignisgesteuert

Jeder, der Webanwendungen entwickelt hat, ist mit dem Mechanismus zur Ereignisbehandlung in Browsern vertraut. Wenn Sie an einem bestimmten Ereignistyp für ein bestimmtes DOM-Element interessiert sind, müssen Sie lediglich einen Ereignis-Listener für das DOM-Element registrieren. Beispielsweise fügt ele.addEventListener("click", function() {}) einen Listener für das Click-Ereignis hinzu. Wenn ein Ereignis auftritt, wird die JavaScript-Methode des Ereignis-Listeners aufgerufen. Ereignisverarbeitungsmethoden werden asynchron ausgeführt. Diese asynchrone Ausführungsmethode eignet sich sehr gut für die Entwicklung leistungsstarker gleichzeitiger Netzwerkanwendungen. Tatsächlich gibt es im Allgemeinen zwei Ansätze für die Entwicklung gleichzeitiger Hochleistungsanwendungen: Der erste besteht darin, einen Multithreading-Mechanismus zu verwenden, und der andere darin, einen ereignisgesteuerten Ansatz zu verwenden. Das Problem bei Multithreading besteht darin, dass es schwierig ist, Anwendungen zu entwickeln, und dass häufig Probleme wie Thread-Aushungerung oder Deadlock auftreten, was höhere Anforderungen an Entwickler stellt. Der ereignisgesteuerte Ansatz ist flexibler, für Webentwickler einfacher zu verstehen und zu verwenden und weist keine Probleme wie Thread-Deadlocks auf. Basierend auf der leistungsstarken Google V8-Engine und der fortschrittlichen Event-I/O-Architektur kann node.js eine gute Grundlage für die Erstellung leistungsstarker serverseitiger Anwendungen sein.

Die Entwicklung von Anwendungen auf Basis von node.js hat ein ähnliches Programmiermodell wie die Entwicklung von Webanwendungen. Viele Module machen einige Ereignisse verfügbar, und der Code, der diese Module verwendet, kann durch die Registrierung von Ereignis-Listenern entsprechende Verarbeitungslogik hinzufügen. Codelisting 4 zeigt den Implementierungscode eines einfachen HTTP-Proxyservers.

Listing 4. HTTP-Proxyserver
var http = require("http");
var url = require("url");

http.createServer(function (req, res) {
var urlObj = url.parse(req.url, true); // Holen Sie sich die Proxy-URL
var urlToProxy = urlObj.query.url;
if (!urlToProxy) {
res.statusCode = 400;
res.end("URL ist erforderlich.");
}
else {
console.log( "Handle Proxy-Anfragen:" + urlToProxy);
var parsedUrl = url.parse(urlToProxy);
var opt = {
host: parsedUrl.hostname,
port: parsedUrl.port || 80 . Opt , Funktion (Pres) {// Fordern Sie den Inhalt der Proxy-URL an
Res.Statuscode = Pres.statuscode;
varhealthrs = Pres.headers;
für (VAR-Schlüssel in Headern) {
res.setHeader(key, headers[key]);
}
}
pres.on("data", function(chunk) {
res.write(chunk); // Zurückschreiben data
}); PRES.ON ("End", Function () {
Res.end ();
}); }). (8088, "127.0.0.1");

console.log("Der Proxyserver wurde auf Port 8088 gestartet. ");

Die Implementierung des gesamten Proxyservers ist relativ einfach. Erstellen Sie zunächst einen HTTP-Server über die Methode createServer() im http-Modul und verwenden Sie dann die Methode listen(), um den HTTP-Server zuzulassen Der in der Methode createServer() übergebene Parameter ist die Antwortmethode der HTTP-Anfrage. Tatsächlich entspricht jede HTTP-Anfrage einem Anforderungsereignis auf dem HTTP-Server eigentlich gleichwertig. Die in Codeliste 5 angegebene Implementierungsmethode


Listing 5. HTTP-Server-Erstellungsmethode mit Ereignismechanismus

var server = http.createServer();

server.on( " request", function(req, res) {

});

In der Anforderungsverarbeitungsmethode wird der Inhalt der Proxy-URL über die http.get()-Methode abgerufen. Ereignisverarbeitungsmethode: pres .on("data", function(chunk) {}) fügt dem Datenereignis von pres eine Verarbeitungsmethode hinzu. Die Funktion dieser Methode besteht darin, den Inhalt der Proxy-URL abzurufen Dasselbe gilt für die Verarbeitung des Endereignisses. Bei der Entwicklung mit node.js werden Sie häufig auf dieses Szenario stoßen, bei dem Ereignisverarbeitungsmethoden und Rückrufmethoden verwendet werden. Angetriebener Mechanismus von node.js, hier sind einige häufig verwendete Module


Zurück nach oben

Gemeinsame Module

node.js. Eine Reihe von Modulen im Zusammenhang mit Netzwerk und Dateisystem Vorgänge werden standardmäßig bereitgestellt. Diese Module bilden die Grundlage für die Erstellung serverseitiger Anwendungen:

Ereignismodul

Wie bereits erwähnt, übernimmt node.js eine ereignisgesteuerte Funktion Architektur und viele seiner Module können von Modulbenutzern hinzugefügt werden. Alle Objekte, die Ereignisse generieren können, befinden sich in der EventEmitter-Klasse Klasse beziehen sich wie folgt auf die Generierung und Verarbeitung von Ereignissen:

addListener(event, listener) und on(event, listener): Diese beiden Methoden werden verwendet, um einem bestimmten Ereignisereignis einen Ereignisverarbeitungsmethoden-Listener hinzuzufügen.
once(event, listener): Diese Methode fügt einen Verarbeitungsmethoden-Listener hinzu, der nur einmal für ein Ereignisereignis ausgeführt wird. Die Verarbeitungsmethode wird nach einmaliger Ausführung gelöscht.
removeListener(event, listener): Diese Methode wird verwendet, um den Handler-Listener für ein Ereignisereignis zu löschen.
emit(event, [arg1], [arg2], [...]): Diese Methode wird verwendet, um ein Ereignisereignis zu generieren. Die Parameter nach dem Ereignisnamen event werden an die entsprechende Ereignisbehandlungsmethode übergeben.
Codeauflistung 6 gibt ein Beispiel für die Verwendung des Ereignismoduls.


Listing 6. Beispiel für die Verwendung eines Ereignismoduls
var events = require("events");
var emitter = new events.EventEmitter();
emitter.on( "myEvent", function(msg) {
console.log(msg);
});
emitter.emit("myEvent", "Hello World.");

at Es liegt ein besonderer Ereignisfehler im Ereignismodul vor. EventEmitter generiert dieses Ereignis, wenn ein Fehler auftritt. Wenn für dieses Ereignis keine entsprechende Behandlungsmethode vorhanden ist, besteht das Standardverhalten darin, das Programm nach Ausgabe einer Fehlermeldung automatisch zu beenden. Achten Sie daher darauf, immer einen Handler für das Fehlerereignis hinzuzufügen.

Streams

Es gibt eine Vielzahl verschiedener Datenflüsse in node.js, einschließlich Dateisystemen, HTTP-Anfragen und -Antworten sowie TCP/UDP-Verbindungen usw. Diese Streams sind alle Instanzen von EventEmitter und können daher eine Vielzahl unterschiedlicher Ereignisse erzeugen. Streams können in drei Typen unterteilt werden: schreibgeschützte, schreibgeschützte und Lese-Schreib-Streams.

Der lesbare Stream generiert hauptsächlich 4 Ereignisse:

Daten: Dieses Ereignis wird generiert, wenn die Daten im Stream gelesen werden.
Ende: Dieses Ereignis wird generiert, wenn im Stream keine Daten zum Lesen vorhanden sind.
Fehler: Dieses Ereignis wird generiert, wenn beim Lesen von Daten ein Fehler auftritt.
close: Dieses Ereignis wird generiert, wenn der Stream geschlossen wird.
Zusätzlich zu den oben genannten Ereignissen gibt es auch eine Pipe()-Methode, mit der der aktuell lesbare Stream mit einem anderen beschreibbaren Stream verbunden werden kann. Daten im lesbaren Stream werden automatisch in den beschreibbaren Stream geschrieben.

Die am häufigsten verwendeten Methoden in beschreibbaren Streams sind write() und end(). Die Methode write() wird verwendet, um Daten in den Stream zu schreiben, und end() wird verwendet, um den Schreibvorgang zu beenden.

Um Binärdaten darzustellen, verwendet node.js die Klasse Buffer, um den Datenpuffer für die Verarbeitung von Binärdaten darzustellen. Die Buffer-Klasse speichert Daten intern in Form von Arrays. Nach der Erstellung kann die Größe des Puffers nicht mehr geändert werden. Instanzen der Buffer-Klasse können in JavaScript in und aus String-Typen konvertiert werden. Beim Konvertieren müssen Sie das Codierungsformat angeben. Der Inhalt von Anfang bis Ende im Puffer kann durch Codierung über die toString-Methode (Encoding, Start, Ende) der Buffer-Klasse in eine codierte Zeichenfolge umgewandelt werden. Unterstützte Kodierungsformate sind: ASCII, UTF8 und Base64. Ein Puffer kann mit einem String str über new Buffer(str, Encoding) initialisiert werden. write(String, Offset, Encoding) wird verwendet, um eine Zeichenfolge im Codierungsformat Encoding an die Position zu schreiben, die beim Offset im Puffer beginnt.

Netzwerkoperationen

node.js bietet einige Module im Zusammenhang mit Netzwerkoperationen, einschließlich TCP, UDP und HTTP usw., die Netzwerkserver und -clients implementieren können.

Die Implementierung des TCP-Protokolls befindet sich im Netzmodul. Ein TCP-Server kann über die Methode createServer(connectionListener) dieses Moduls erstellt werden. Der Parameter ConnectionListener ist die Verarbeitungsmethode, wenn ein Client eine Verbindung zum Server herstellt, was der Verarbeitung des Verbindungsereignisses entspricht. Ein TCP-Server ist eine Instanz der Klasse Server. Die Listen-Methode ermöglicht es dem Server, einen angegebenen Port abzuhören.

Wenn Sie eine Verbindung zu einem vorhandenen TCP-Server herstellen möchten, können Sie die Methode createConnection(port, host) verwenden, um eine Verbindung zum Port-Port des angegebenen Host-Hosts herzustellen. Der Rückgabewert dieser Methode ist eine Instanz der Socket-Klasse, die eine Socket-Verbindung darstellt. Nachdem Sie eine Instanz der Socket-Klasse erhalten haben, können Sie über die Methode write() Daten in die Verbindung schreiben. Wenn Sie Daten von dieser Verbindung abrufen möchten, können Sie eine Methode zur Datenereignisbehandlung hinzufügen.

Ein einfacher TCP-Server für die Ausdrucksberechnung ist in Codelisting 7 angegeben. Sie können zum Testen eine Verbindung zu diesem Server über den Telnet-Befehl herstellen.


Listing 7. Einfacher Ausdrucksauswertungsserver
var net = require("net");
var server = net.createServer(function(socket) {
socket.setEncoding( "utf8 ");
var buffer = [], len = 0;
socket.on("data", function(data) { // Client-Daten empfangen
if (data.charCodeAt( 0) == 13) {
var expr = buffer.join("");
try {
var result = eval(expr); // Berechnen
socket.write(resul t. toString()) ; // Ergebnis zurückschreiben });
server.listen (8180, "127.0.0.1");
console.log("Der Server wurde auf Port 8180 gestartet.");

Zusätzlich zum TCP-Server können die Module http und https sein HTTP- und HTTPS-Server werden separat implementiert, das Modul dgram kann UDP/Datagram-Socket-Verbindungen implementieren und das Modul tls kann sichere Socket-Verbindungen (SSL) implementieren. Diese Module werden alle ähnlich wie das TCP-Modul verwendet.

Dateisystem

Das fs-Modul in node.js wird zum Betrieb des lokalen Dateisystems verwendet. Mit den im fs-Modul bereitgestellten Methoden können grundlegende Dateivorgänge ausgeführt werden, darunter Lesen, Schreiben, Umbenennen, Erstellen und Löschen von Verzeichnissen sowie das Abrufen von Dateimetadaten. Für jede Methode zum Bearbeiten von Dateien gibt es sowohl synchrone als auch asynchrone Versionen. Die asynchrone Version des Vorgangs verwendet immer eine Rückrufmethode als letzten Parameter. Wenn der Vorgang abgeschlossen ist, wird die Rückrufmethode aufgerufen. Der erste Parameter der Callback-Methode ist immer für mögliche Ausnahmen im Betrieb reserviert. Wenn der Vorgang ordnungsgemäß erfolgreich ist, ist der Wert des ersten Parameters null oder undefiniert. Der Methodenname der synchronen Betriebsversion wird mit einem Sync als Suffix nach der entsprechenden asynchronen Methode hinzugefügt. Die synchrone Version der asynchronen rename()-Methode ist beispielsweise renameSync(). Nachfolgend sind einige gängige Methoden im fs-Modul aufgeführt. Es wird nur die asynchrone Betriebsversion vorgestellt.

rename(path1, path2): Benennen Sie das durch path1 dargestellte Verzeichnis oder die Datei in path2 um.
truncate(fd, len): Kürzet die Länge der Datei, die dem Dateideskriptor fd entspricht, auf len.
chmod(Pfad, Modus): Ändern Sie die Berechtigungen des durch den Pfad dargestellten Verzeichnisses oder der Datei in den Modus.
stat(path): Rufen Sie die Metadaten des durch den Pfad dargestellten Verzeichnisses oder der Datei ab. Metadaten werden mithilfe der Stats-Klasse dargestellt.

open(path, flags, mode): Öffnet eine durch den Pfad dargestellte Datei. Der Dateideskriptor kann in der Callback-Methode abgerufen werden.

read(fd, buffer, offset, length, position): Lesen Sie die Daten der Längenbytes ab der Position in der Datei, die durch den angegebenen Dateideskriptor fd dargestellt wird, und speichern Sie sie am Anfang im Pufferpuffer Position. Die tatsächliche Anzahl der gelesenen Bytes kann in der Callback-Methode ermittelt werden.

write(fd, buffer, offset, length, position): Schreiben Sie die Daten im Pufferpuffer in die Datei, die durch den Dateideskriptor fd dargestellt wird. Die Bedeutung der Parameter ist dieselbe wie bei der Methode read(). Die tatsächliche Anzahl der geschriebenen Bytes kann in der Callback-Methode ermittelt werden.

readFile(Dateiname, Kodierung): Liest den Inhalt einer Datei Dateiname im Kodierungsformat Kodierung. Der Inhalt der Datei kann in der Callback-Methode abgerufen werden.

writeFile (Dateiname, Daten, Kodierung): Schreiben Sie die Datendaten in die Datei Dateiname im Kodierungsformat Kodierung.

Zusätzlich zu den oben aufgeführten Methoden zum direkten Bearbeiten der Datei selbst können Sie die Datei auch in einen Stream konvertieren. createReadStream(path, options) und createWriteStream(path, options) werden verwendet, um lesbare bzw. beschreibbare Streams aus Dateien zu erstellen. Der Parameterpfad stellt den Pfad zur Datei dar, und Optionen ist ein JavaScript-Objekt, das Optionen beim Lesen oder Schreiben der Datei darstellt.

Die Implementierung eines einfachen HTTP-statischen Dateiservers ist in Code Listing 8 angegeben.


Listing 8. Statischer HTTP-Dateiserver
var http = require("http"),
fs = require("fs"),
path = require("path"),
url = require("url");

var server = http.createServer(function(req, res) {
var pathname = url.parse(req.url).pathname;
var filepath = path.join("/tmp", "wwwroot", pathname);
var stream = fs.createReadStream(filepath, {flags : "r", binding : null});
stream .on("error", function() {
res.writeHead(404);
res.end();
});
stream.pipe(res);
} );
server.on("error", function(error) {
console.log(error);
});
server.listen(8088, "127.0.0.1");

Wie in Codeliste 8 gezeigt, konvertieren Sie zunächst den Pfad der HTTP-Anforderung in einen Dateipfad auf dem Server, erstellen Sie dann einen lesbaren Stream aus der Datei und leiten Sie schließlich den Dateidatenstrom an die HTTP-Anforderung weiter die Methode „pipe()“ als Antwort.

Hilfsmodule

Zusätzlich zu den oben vorgestellten allgemeinen Modulen bietet node.js auch einige Hilfsmodule.

Der Modulpfad wird verwendet, um Pfade im Dateisystem zu verwalten. join() wird in diesem Modul verwendet, um mehrere Pfade zu einem vollständigen Pfad zu verbinden. Das Ergebnis von join("/usr", "home", "test/index.html") ist beispielsweise der Pfad /usr/home/test/index.html. normalize() wird verwendet, um den Pfad zu normalisieren, überflüssiges „/“ zu entfernen und „..“ und „.“ zu verarbeiten. Die Methode „resolve([from ...], to)“ wird verwendet, um den absoluten Pfad des angegebenen Pfads zu zu erhalten. Wenn to kein absoluter Pfad ist, addieren Sie die vorherigen Parameter von rechts nach links, bis Sie einen absoluten Pfad erhalten. Wenn der absolute Pfad am Ende nicht ermittelt werden kann, fügen Sie das aktuelle Arbeitsverzeichnis hinzu. Unter der Annahme, dass das aktuelle Arbeitsverzeichnis /usr/home ist, lautet das Rückgabeergebnis von „resolve(“test“, „index.html“) /usr/home/test/index.html. Die Methode dirname() wird verwendet, um den Verzeichnisteil des Pfads abzurufen. Das Rückgabeergebnis von dirname("/usr/home/index.html") ist beispielsweise /usr/home. basename() wird verwendet, um den letzten Teil des Pfads abzurufen. Das Rückgabeergebnis von Basisname("/usr/home/index.html") ist beispielsweise index.html. extname() wird verwendet, um den Dateierweiterungsteil eines Pfads abzurufen. Das Rückgabeergebnis von extname("/usr/home/index.html") ist beispielsweise .html.

Die Modul-URL wird zum Parsen von URLs verwendet. Die Methode parse(urlStr, parseQueryString) wird verwendet, um eine URL-Zeichenfolge urlStr in mehrere Teile wie Hostname, Port und Pfad zu analysieren. Der Rückgabewert dieser Methode ist ein JavaScript-Objekt, das Eigenschaften wie Protokoll, Hostname, Port, Pfadname und Abfrage enthält. Wenn der Wert des Parameters parseQueryString „true“ ist, wird auch der in der URL enthaltene Teil der Abfragezeichenfolge analysiert. Die format(urlObj)-Methode ist das Gegenteil der parse()-Methode und wird zum Erstellen einer URL-Zeichenfolge aus einem JavaScript-Objekt verwendet.

Das Modul Querystring dient zur Verarbeitung von Query-Strings in URLs. Die Methode stringify(obj) wird verwendet, um ein JavaScript-Objekt obj in das Abfragezeichenfolgenformat zu konvertieren. Beispielsweise gibt stringify({a : 1, b : "good"}) a=1&b=good zurück. parse(str) wird verwendet, um eine Abfragezeichenfolge in ein JavaScript-Objekt zu analysieren.

Mit dem Modul vm kann JavaScript-Code ausgeführt werden. Die Methode runInThisContext(code) wird verwendet, um einen Teil des JavaScript-Codecodes auszuführen und seine Ergebnisse zurückzugeben. JavaScript-Code, der über diese Methode ausgeführt wird, kann nicht auf den Umfang des aktuellen Codes zugreifen. Die runInNewContext(code, [sandbox])-Methode wird auch zum Ausführen von JavaScript-Code verwendet. Im Gegensatz zu runInThisContext() verwendet der über diese Methode ausgeführte JavaScript-Code das Sandbox-Objekt als globales Objekt. Das Rückgabeergebnis von runInNewContext("a + 3", {a : 4}) ist beispielsweise 7. Mit der Methode createScript(code) wird ein JavaScript-Code vorkompiliert, dieser jedoch nicht sofort ausgeführt. Der Rückgabewert dieser Methode ist ein Script-Objekt. Dieses Objekt verfügt außerdem über zwei Methoden, runInThisContext() und runInNewContext([sandbox]), die ähnliche Bedeutungen wie die beiden oben genannten Methoden haben.

Modul os stellt einige Informationen zum zugrunde liegenden Betriebssystem bereit. Einschließlich hostname() wird verwendet, um den Hostnamen des Betriebssystems abzurufen; type() wird verwendet, um die Versionsnummer des Betriebssystems abzurufen; um die Systemlaufzeit in Sekunden zu erhalten, wird ;cpus() verwendet, um CPU-bezogene Informationen zu erhalten. freemem() und totalmem() werden verwendet, um den Gesamtspeicher bzw. den verfügbaren Speicher des Systems zu ermitteln.

Das Modul util stellt einige häufig verwendete Hilfsmethoden bereit. Die Methode debug(string) wird verwendet, um Informationen an den Standardfehlerstrom auszugeben. Die Methode log(string) wird verwendet, um Informationen mit Zeitstempeln im Standardausgabestream auszugeben. Die Methode „inspect(object, showHidden, Depth)“ wird verwendet, um die interne Struktur eines Objekts auszugeben. Der Parameter „object“ gibt an, ob die verborgenen Attribute des Objekts angezeigt werden sollen Die angezeigte Hierarchie ist standardmäßig auf 2 eingestellt. Die Methode inherits(constructor, superConstructor) wird verwendet, um den prototypbasierten Vererbungsmechanismus in JavaScript zu implementieren.

Nach der Einführung der von node.js bereitgestellten allgemeinen Module finden Sie hier ein vollständiges Beispiel, um die Verwendung von node.js zu veranschaulichen.

Zurück zum Anfang

Instanzanalyse

Die in diesem Beispiel implementierte Funktion besteht darin, den Speichernutzungsstatus des Servers, also die Speicherbelegungsrate, dynamisch zu überwachen. Das Ermitteln der Speichernutzung auf dem Server ist relativ einfach. Sie müssen lediglich die vom Betriebssystemmodul bereitgestellte Methode verwenden, nämlich freemem ()/totalmem (). Um die Speicherbelegung in Echtzeit zu überwachen, muss der Server Daten in Echtzeit an den Browser übertragen. Die beste Implementierung ist hier die in HTML 5 eingeführte WebSocket-Spezifikation. Diese Spezifikation wird in neuen Browsern wie Firefox 4 und Google Chrome unterstützt. Gleichzeitig muss auch die Serverseite diese Spezifikation unterstützen. Socket.IO bietet Unterstützung für die WebSocket-Spezifikation auf node.js, einschließlich serverseitigem und browserseitigem Code. Codelisting 9 zeigt den serverseitigen Code mit Socket.IO.


Listing 9. Serverseitiger Code zur Überwachung der Speichernutzung
var io = require('./socket.io');
var io = io.listen(server);
io.on("connection", function(client){
setInterval(function() {
client.send(os.freemem() / os.totalmem());
}, 500);
});

In Codelisting 9 ist Server ein HTTP-Serverobjekt in node.js, das zur Beantwortung allgemeiner HTTP-Anfragen verwendet wird. Socket.IO kann Anfragen vom HTTP-Server node.js abfangen und einige Anfragen zur Verarbeitung an Socket.IO übergeben. Die Verarbeitungslogik besteht hier darin, dass bei der Verbindung eines Clients alle 500 Millisekunden die Speichernutzung des Servers an den Client gesendet wird. Codelisting 10 zeigt den browserseitigen HTML- und JavaScript-Code.


Listing 10. Browserseitiger Code zur Überwachung der Speichernutzung



Serverspeichernutzung< ;/title><br> <script src="/socket.io/socket.io.js"></script><br> <style><br> #usage {border: 1px gestrichelt grün; }  < h1> Speichernutzung<br>  <canvas id="usage" width="200" height="200">< ;/canvas><br> </ html><br><br><br><br></p></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>Stellungnahme:</span><div>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</div></div></div><div class="nphpSytBox"><span>Vorheriger Artikel:<a class="dBlack" title="Objektinstanz des JavaScript-Protokollvorgangs" href="http://m.php.cn/de/faq/341228.html">Objektinstanz des JavaScript-Protokollvorgangs</a></span><span>Nächster Artikel:<a class="dBlack" title="Objektinstanz des JavaScript-Protokollvorgangs" href="http://m.php.cn/de/faq/341232.html">Objektinstanz des JavaScript-Protokollvorgangs</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>In Verbindung stehende Artikel</h2><em><a href="http://m.php.cn/de/article.html" class="bBlack"><i>Mehr sehen</i><b></b></a></em><div class="clear"></div></div><ul class="nphpXgwzList"><li><b></b><a href="http://m.php.cn/de/faq/1609.html" title="Eine eingehende Analyse der Bootstrap-Listengruppenkomponente" class="aBlack">Eine eingehende Analyse der Bootstrap-Listengruppenkomponente</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/1640.html" title="Detaillierte Erläuterung des JavaScript-Funktions-Curryings" class="aBlack">Detaillierte Erläuterung des JavaScript-Funktions-Curryings</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/1949.html" title="Vollständiges Beispiel für die Generierung von JS-Passwörtern und die Erkennung der Stärke (mit Download des Demo-Quellcodes)" class="aBlack">Vollständiges Beispiel für die Generierung von JS-Passwörtern und die Erkennung der Stärke (mit Download des Demo-Quellcodes)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/2248.html" title="Angularjs integriert WeChat UI (weui)" class="aBlack">Angularjs integriert WeChat UI (weui)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/2351.html" title="Wie man mit JavaScript schnell zwischen traditionellem Chinesisch und vereinfachtem Chinesisch wechselt und wie Websites den Wechsel zwischen vereinfachtem und traditionellem Chinesisch unterstützen – Javascript-Kenntnisse" class="aBlack">Wie man mit JavaScript schnell zwischen traditionellem Chinesisch und vereinfachtem Chinesisch wechselt und wie Websites den Wechsel zwischen vereinfachtem und traditionellem Chinesisch unterstützen – Javascript-Kenntnisse</a><div class="clear"></div></li></ul></div></div><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!</p></div><div class="footermid"><a href="http://m.php.cn/de/about/us.html">Über uns</a><a href="http://m.php.cn/de/about/disclaimer.html">Haftungsausschluss</a><a href="http://m.php.cn/de/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>