Heim Web-Frontend js-Tutorial Serverseitige JavaScript-Programmierung mit node.js

Serverseitige JavaScript-Programmierung mit node.js

Nov 26, 2016 pm 01:16 PM
javascript

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> <div class="wzconShengming_sp"> <div class="bzsmdiv_sp">Erklärung dieser Website</div> <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> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="2507867629"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div class="AI_ToolDetails_main4sR"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5902227090019525" data-ad-slot="3653428331" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <!-- <div class="phpgenera_Details_mainR4"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hotarticle2.png" alt="" /> <h2>Heißer Artikel</h2> </div> <div class="phpgenera_Details_mainR4_bottom"> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796785841.html" title="Assassin's Creed Shadows: Seashell Riddle -Lösung" class="phpgenera_Details_mainR4_bottom_title">Assassin's Creed Shadows: Seashell Riddle -Lösung</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>3 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796789525.html" title="Was ist neu in Windows 11 KB5054979 und wie Sie Update -Probleme beheben" class="phpgenera_Details_mainR4_bottom_title">Was ist neu in Windows 11 KB5054979 und wie Sie Update -Probleme beheben</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>2 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796785857.html" title="Wo kann man die Kransteuerungsschlüsselkarten in Atomfall finden" class="phpgenera_Details_mainR4_bottom_title">Wo kann man die Kransteuerungsschlüsselkarten in Atomfall finden</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>3 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796784440.html" title="<🎜>: Dead Rails - wie man jede Herausforderung abschließt" class="phpgenera_Details_mainR4_bottom_title"><🎜>: Dead Rails - wie man jede Herausforderung abschließt</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>4 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796784000.html" title="Atomfall Guide: Gegenstandsstandorte, Questführer und Tipps" class="phpgenera_Details_mainR4_bottom_title">Atomfall Guide: Gegenstandsstandorte, Questführer und Tipps</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>1 Monate vor</span> <span>By DDD</span> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/de/article.html">Mehr anzeigen</a> </div> </div> </div> --> <div class="phpgenera_Details_mainR3"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hottools2.png" alt="" /> <h2>Heiße KI -Werkzeuge</h2> </div> <div class="phpgenera_Details_mainR3_bottom"> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/ai/undresserai-undress" title="Undresser.AI Undress" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173411540686492.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Undresser.AI Undress" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/ai/undresserai-undress" title="Undresser.AI Undress" class="phpmain_tab2_mids_title"> <h3>Undresser.AI Undress</h3> </a> <p>KI-gestützte App zum Erstellen realistischer Aktfotos</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/ai/ai-clothes-remover" title="AI Clothes Remover" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173411552797167.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="AI Clothes Remover" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/ai/ai-clothes-remover" title="AI Clothes Remover" class="phpmain_tab2_mids_title"> <h3>AI Clothes Remover</h3> </a> <p>Online-KI-Tool zum Entfernen von Kleidung aus Fotos.</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/ai/undress-ai-tool" title="Undress AI Tool" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173410641626608.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Undress AI Tool" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/ai/undress-ai-tool" title="Undress AI Tool" class="phpmain_tab2_mids_title"> <h3>Undress AI Tool</h3> </a> <p>Ausziehbilder kostenlos</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/ai/clothoffio" title="Clothoff.io" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173411529149311.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Clothoff.io" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/ai/clothoffio" title="Clothoff.io" class="phpmain_tab2_mids_title"> <h3>Clothoff.io</h3> </a> <p>KI-Kleiderentferner</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/ai/video-swap" title="Video Face Swap" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173414504068133.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Video Face Swap" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/ai/video-swap" title="Video Face Swap" class="phpmain_tab2_mids_title"> <h3>Video Face Swap</h3> </a> <p>Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!</p> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/de/ai">Mehr anzeigen</a> </div> </div> </div> <script src="https://sw.php.cn/hezuo/cac1399ab368127f9b113b14eb3316d0.js" type="text/javascript"></script> <div class="phpgenera_Details_mainR4"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hotarticle2.png" alt="" /> <h2>Heißer Artikel</h2> </div> <div class="phpgenera_Details_mainR4_bottom"> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796785841.html" title="Assassin's Creed Shadows: Seashell Riddle -Lösung" class="phpgenera_Details_mainR4_bottom_title">Assassin's Creed Shadows: Seashell Riddle -Lösung</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>3 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796789525.html" title="Was ist neu in Windows 11 KB5054979 und wie Sie Update -Probleme beheben" class="phpgenera_Details_mainR4_bottom_title">Was ist neu in Windows 11 KB5054979 und wie Sie Update -Probleme beheben</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>2 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796785857.html" title="Wo kann man die Kransteuerungsschlüsselkarten in Atomfall finden" class="phpgenera_Details_mainR4_bottom_title">Wo kann man die Kransteuerungsschlüsselkarten in Atomfall finden</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>3 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796784440.html" title="<🎜>: Dead Rails - wie man jede Herausforderung abschließt" class="phpgenera_Details_mainR4_bottom_title"><🎜>: Dead Rails - wie man jede Herausforderung abschließt</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>4 Wochen vor</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/1796784000.html" title="Atomfall Guide: Gegenstandsstandorte, Questführer und Tipps" class="phpgenera_Details_mainR4_bottom_title">Atomfall Guide: Gegenstandsstandorte, Questführer und Tipps</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>1 Monate vor</span> <span>By DDD</span> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/de/article.html">Mehr anzeigen</a> </div> </div> </div> <div class="phpgenera_Details_mainR3"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hottools2.png" alt="" /> <h2>Heiße Werkzeuge</h2> </div> <div class="phpgenera_Details_mainR3_bottom"> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/toolset/development-tools/92" title="Notepad++7.3.1" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58ab96f0f39f7357.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="Notepad++7.3.1" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/toolset/development-tools/92" title="Notepad++7.3.1" class="phpmain_tab2_mids_title"> <h3>Notepad++7.3.1</h3> </a> <p>Einfach zu bedienender und kostenloser Code-Editor</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/toolset/development-tools/93" title="SublimeText3 chinesische Version" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58ab97a3baad9677.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="SublimeText3 chinesische Version" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/toolset/development-tools/93" title="SublimeText3 chinesische Version" class="phpmain_tab2_mids_title"> <h3>SublimeText3 chinesische Version</h3> </a> <p>Chinesische Version, sehr einfach zu bedienen</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/toolset/development-tools/121" title="Senden Sie Studio 13.0.1" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58ab97ecd1ab2670.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="Senden Sie Studio 13.0.1" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/toolset/development-tools/121" title="Senden Sie Studio 13.0.1" class="phpmain_tab2_mids_title"> <h3>Senden Sie Studio 13.0.1</h3> </a> <p>Leistungsstarke integrierte PHP-Entwicklungsumgebung</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/toolset/development-tools/469" title="Dreamweaver CS6" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58d0e0fc74683535.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="Dreamweaver CS6" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/toolset/development-tools/469" title="Dreamweaver CS6" class="phpmain_tab2_mids_title"> <h3>Dreamweaver CS6</h3> </a> <p>Visuelle Webentwicklungstools</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/de/toolset/development-tools/500" title="SublimeText3 Mac-Version" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58d34035e2757995.png?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="SublimeText3 Mac-Version" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/de/toolset/development-tools/500" title="SublimeText3 Mac-Version" class="phpmain_tab2_mids_title"> <h3>SublimeText3 Mac-Version</h3> </a> <p>Codebearbeitungssoftware auf Gottesniveau (SublimeText3)</p> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/de/ai">Mehr anzeigen</a> </div> </div> </div> <div class="phpgenera_Details_mainR4"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hotarticle2.png" alt="" /> <h2>Heiße Themen</h2> </div> <div class="phpgenera_Details_mainR4_bottom"> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/gmailyxdlrkzn" title="Wo ist der Login-Zugang für Gmail-E-Mail?" class="phpgenera_Details_mainR4_bottom_title">Wo ist der Login-Zugang für Gmail-E-Mail?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>7677</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>15</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/cakephp-tutor" title="CakePHP-Tutorial" class="phpgenera_Details_mainR4_bottom_title">CakePHP-Tutorial</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>1393</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>52</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/c-tutorial" title="C#-Tutorial" class="phpgenera_Details_mainR4_bottom_title">C#-Tutorial</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>1207</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>24</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/steamdzhmcssmgs" title="Wie lautet das Format des Kontonamens von Steam?" class="phpgenera_Details_mainR4_bottom_title">Wie lautet das Format des Kontonamens von Steam?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>91</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>11</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/de/faq/winactivationkeyper" title="Win11 -Aktivierungsschlüssel dauerhaft" class="phpgenera_Details_mainR4_bottom_title">Win11 -Aktivierungsschlüssel dauerhaft</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>73</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>19</span> </div> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/de/faq/zt">Mehr anzeigen</a> </div> </div> </div> </div> </div> <div class="Article_Details_main2"> <div class="phpgenera_Details_mainL4"> <div class="phpmain1_2_top"> <a href="javascript:void(0);" class="phpmain1_2_top_title">Related knowledge<img src="/static/imghw/index2_title2.png" alt="" /></a> </div> <div class="phpgenera_Details_mainL4_info"> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/633424.html" title="So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/887/227/170279609162144.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript" /> </a> <a href="https://www.php.cn/de/faq/633424.html" title="So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript" class="phphistorical_Version2_mids_title">So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript</a> <span class="Articlelist_txts_time">Dec 17, 2023 pm 02:54 PM</span> <p class="Articlelist_txts_p">So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/633480.html" title="WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/465/014/170280543760094.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen" /> </a> <a href="https://www.php.cn/de/faq/633480.html" title="WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen" class="phphistorical_Version2_mids_title">WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen</a> <span class="Articlelist_txts_time">Dec 17, 2023 pm 05:30 PM</span> <p class="Articlelist_txts_p">WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/633365.html" title="Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/887/227/170278617570921.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems" /> </a> <a href="https://www.php.cn/de/faq/633365.html" title="Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems" class="phphistorical_Version2_mids_title">Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems</a> <span class="Articlelist_txts_time">Dec 17, 2023 pm 12:09 PM</span> <p class="Articlelist_txts_p">Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/633311.html" title="So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/887/227/170277714783917.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript" /> </a> <a href="https://www.php.cn/de/faq/633311.html" title="So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript" class="phphistorical_Version2_mids_title">So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript</a> <span class="Articlelist_txts_time">Dec 17, 2023 am 09:39 AM</span> <p class="Articlelist_txts_p">So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/633476.html" title="JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/465/014/170280442251580.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems" /> </a> <a href="https://www.php.cn/de/faq/633476.html" title="JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems" class="phphistorical_Version2_mids_title">JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems</a> <span class="Articlelist_txts_time">Dec 17, 2023 pm 05:13 PM</span> <p class="Articlelist_txts_p">JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/642543.html" title="Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/887/227/170444932683164.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode" /> </a> <a href="https://www.php.cn/de/faq/642543.html" title="Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode" class="phphistorical_Version2_mids_title">Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode</a> <span class="Articlelist_txts_time">Jan 05, 2024 pm 06:08 PM</span> <p class="Articlelist_txts_p">JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/630681.html" title="So verwenden Sie insertBefore in Javascript" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="?x-oss-process=image/resize,m_fill,h_207,w_330" alt="So verwenden Sie insertBefore in Javascript" /> </a> <a href="https://www.php.cn/de/faq/630681.html" title="So verwenden Sie insertBefore in Javascript" class="phphistorical_Version2_mids_title">So verwenden Sie insertBefore in Javascript</a> <span class="Articlelist_txts_time">Nov 24, 2023 am 11:56 AM</span> <p class="Articlelist_txts_p">Verwendung: In JavaScript wird die Methode insertBefore() verwendet, um einen neuen Knoten in den DOM-Baum einzufügen. Diese Methode erfordert zwei Parameter: den neuen Knoten, der eingefügt werden soll, und den Referenzknoten (d. h. den Knoten, an dem der neue Knoten eingefügt wird).</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/de/faq/633281.html" title="JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Bildverarbeitungssystems" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/887/227/170277372169688.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Bildverarbeitungssystems" /> </a> <a href="https://www.php.cn/de/faq/633281.html" title="JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Bildverarbeitungssystems" class="phphistorical_Version2_mids_title">JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Bildverarbeitungssystems</a> <span class="Articlelist_txts_time">Dec 17, 2023 am 08:41 AM</span> <p class="Articlelist_txts_p">JavaScript ist eine in der Webentwicklung weit verbreitete Programmiersprache, während WebSocket ein Netzwerkprotokoll für die Echtzeitkommunikation ist. Durch die Kombination der leistungsstarken Funktionen beider können wir ein effizientes Echtzeit-Bildverarbeitungssystem erstellen. In diesem Artikel wird erläutert, wie dieses System mithilfe von JavaScript und WebSocket implementiert wird, und es werden spezifische Codebeispiele bereitgestellt. Zunächst müssen wir die Anforderungen und Ziele des Echtzeit-Bildverarbeitungssystems klären. Angenommen, wir haben ein Kameragerät, das Bilddaten in Echtzeit sammeln kann</p> </div> </div> <a href="https://www.php.cn/de/web-designer.html" class="phpgenera_Details_mainL4_botton"> <span>See all articles</span> <img src="/static/imghw/down_right.png" alt="" /> </a> </div> </div> </div> </main> <footer> <div class="footer"> <div class="footertop"> <img src="/static/imghw/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="https://www.php.cn/de/about/us.html">Über uns</a> <a href="https://www.php.cn/de/about/disclaimer.html">Haftungsausschluss</a> <a href="https://www.php.cn/de/update/article_0_1.html">Sitemap</a> </div> <div class="footerbottom"> <p> © php.cn All rights reserved </p> </div> </div> </footer> <input type="hidden" id="verifycode" value="/captcha.html"> <script>layui.use(['element', 'carousel'], function () {var element = layui.element;$ = layui.jquery;var carousel = layui.carousel;carousel.render({elem: '#test1', width: '100%', height: '330px', arrow: 'always'});$.getScript('/static/js/jquery.lazyload.min.js', function () {$("img").lazyload({placeholder: "/static/images/load.jpg", effect: "fadeIn", threshold: 200, skip_invisible: false});});});</script> <script src="/static/js/common_new.js"></script> <script type="text/javascript" src="/static/js/jquery.cookie.js?1745446614"></script> <script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script> <link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css?2' 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 type="text/javascript" src="/static/js/global.min.js?5.5.53"></script> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function () { var u = "https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u + 'matomo.php']); _paq.push(['setSiteId', '9']); var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s); })(); </script> <script> // top layui.use(function () { var util = layui.util; util.fixbar({ on: { mouseenter: function (type) { layer.tips(type, this, { tips: 4, fixed: true, }); }, mouseleave: function (type) { layer.closeAll("tips"); }, }, }); }); document.addEventListener("DOMContentLoaded", (event) => { // 定义一个函数来处理滚动链接的点击事件 function setupScrollLink(scrollLinkId, targetElementId) { const scrollLink = document.getElementById(scrollLinkId); const targetElement = document.getElementById(targetElementId); if (scrollLink && targetElement) { scrollLink.addEventListener("click", (e) => { e.preventDefault(); // 阻止默认链接行为 targetElement.scrollIntoView({ behavior: "smooth" }); // 平滑滚动到目标元素 }); } else { console.warn( `Either scroll link with ID '${scrollLinkId}' or target element with ID '${targetElementId}' not found.` ); } } // 使用该函数设置多个滚动链接 setupScrollLink("Article_Details_main1L2s_1", "article_main_title1"); setupScrollLink("Article_Details_main1L2s_2", "article_main_title2"); setupScrollLink("Article_Details_main1L2s_3", "article_main_title3"); setupScrollLink("Article_Details_main1L2s_4", "article_main_title4"); setupScrollLink("Article_Details_main1L2s_5", "article_main_title5"); setupScrollLink("Article_Details_main1L2s_6", "article_main_title6"); // 可以继续添加更多的滚动链接设置 }); window.addEventListener("scroll", function () { var fixedElement = document.getElementById("Article_Details_main1Lmain"); var scrollTop = window.scrollY || document.documentElement.scrollTop; // 兼容不同浏览器 var clientHeight = window.innerHeight || document.documentElement.clientHeight; // 视口高度 var scrollHeight = document.documentElement.scrollHeight; // 页面总高度 // 计算距离底部的距离 var distanceToBottom = scrollHeight - scrollTop - clientHeight; // 当距离底部小于或等于300px时,取消固定定位 if (distanceToBottom <= 980) { fixedElement.classList.remove("Article_Details_main1Lmain"); fixedElement.classList.add("Article_Details_main1Lmain_relative"); } else { // 否则,保持固定定位 fixedElement.classList.remove("Article_Details_main1Lmain_relative"); fixedElement.classList.add("Article_Details_main1Lmain"); } }); </script> <script> document.addEventListener('DOMContentLoaded', function() { const mainNav = document.querySelector('.Article_Details_main1Lmain'); const header = document.querySelector('header'); if (mainNav) { window.addEventListener('scroll', function() { const scrollPosition = window.scrollY; if (scrollPosition > 84) { mainNav.classList.add('fixed'); } else { mainNav.classList.remove('fixed'); } }); } }); </script> </body> </html>