Heim  >  Artikel  >  Web-Frontend  >  Erfahren Sie mehr über einige Funktionen in Node.js_node.js

Erfahren Sie mehr über einige Funktionen in Node.js_node.js

WBOY
WBOYOriginal
2016-05-16 16:35:291209Durchsuche

Node.js ist eine aufstrebende Backend-Sprache, die Programmierern dabei helfen soll, schnell skalierbare Anwendungen zu erstellen. Node.js verfügt über viele attraktive Funktionen und es gibt unzählige Berichte darüber. In diesem Artikel werden Funktionen wie EventEmitter, Streams, Coding Style, Linting und Coding Style analysiert und erläutert, um Benutzern ein tieferes Verständnis von Node.js zu vermitteln.

Da es sich um eine Plattform handelt, die auf der Chrome-JavaScript-Laufzeit basiert, scheinen unsere JavaScript-Kenntnisse auf Knotenanwendungen anwendbar zu sein, ohne dass zusätzliche Spracherweiterungen oder -modifikationen erforderlich sind. Wir können unsere Front-End-Programmiererfahrung auf die Backend-Programmierung anwenden.

EventEmitter (Ereignissemitter)

Zunächst sollten Sie das EventEmitter-Modell verstehen. Es kann ein Ereignis senden und es Verbrauchern ermöglichen, interessante Ereignisse zu abonnieren. Wir können es uns als eine Erweiterung des Callback-Übermittlungsmusters auf eine asynchrone Funktion vorstellen. EventEmitter ist insbesondere dann vorteilhafter, wenn mehrere Rückrufe erforderlich sind.

Zum Beispiel sendet ein Anrufer eine „Dateien auflisten“-Anfrage an einen Remote-Server. Möglicherweise möchten Sie die zurückgegebenen Ergebnisse gruppieren und für jede Gruppe einen Rückruf durchführen. Mit dem EventEmitter-Modell können Sie an jede Gruppe einen „Datei“-Rückruf senden und die Verarbeitung „beenden“, wenn alle Vorgänge abgeschlossen sind.

Bei Verwendung von EventEmitter müssen Sie nur die relevanten Ereignisse und Parameter festlegen.

Code kopieren Der Code lautet wie folgt:

var EventEmitter = require('events').EventEmitter; var util = require('util');
Funktion MyClass() {
if (!(diese Instanz von MyClass)) return new MyClass();
EventEmitter.call(this);

var self = this;
setTimeout(function timeoutCb() {
Self.emit('myEvent', 'hello world', 42);
}, 1000);
}
util.inherits(MyClass, EventEmitter);



Der MyClass-Konstruktor erstellt einen Zeittrigger mit einer Triggerverzögerung von 1 Sekunde und einem Triggerereignis von myEvent. Um verwandte Ereignisse zu verwenden, müssen Sie die on()-Methode ausführen:

Code kopieren Der Code lautet wie folgt: var myObj = new MyClass(); var start = Date.now();
myObj.on('myEvent', function myEventCb(str, num) {
console.log('myEvent ausgelöst', str, num, Date.now() - start); });



Hier ist zu beachten, dass das abonnierte EventEmitter-Ereignis zwar ein asynchrones Ereignis ist, die Aktionen des Listeners jedoch synchronisiert werden, wenn die Zeit ausgelöst wird. Wenn das obige myEvent-Ereignis also 10 Listener hat, werden alle Listener der Reihe nach aufgerufen, ohne auf die Ereignisschleife warten zu müssen.

Wenn eine Unterklasse von EventEmitter ein emit('error')-Ereignis generiert, aber kein Listener es abonniert, löst die EventEmitter-Basisklasse eine Ausnahme aus, die dazu führt, dass eine uncaughtException ausgelöst wird, wenn das Prozessobjekt ausgeführt wird.

Fehler

verror ist eine Erweiterung der Basisklasse Error, die es uns ermöglicht, Ausgabenachrichten im printf-Zeichenformat zu definieren.

Streams

Wenn eine sehr große Datei verarbeitet werden muss, sollte die ideale Methode darin bestehen, einen Teil davon zu lesen und einen Teil davon zu schreiben. Egal wie groß die Datei ist, solange es die Zeit erlaubt, wird die Verarbeitung immer durchgeführt Hier muss das Konzept des Streams verwendet werden. Streams sind ein weiteres weit verbreitetes Modell in Node, der Implementierung von EventEmitter. Bietet lesbare, beschreibbare oder Vollduplex-Schnittstellen. Es handelt sich um eine abstrakte Schnittstelle, die regelmäßige Betriebsereignisse bereitstellt, darunter: lesbar, beschreibbar, Entleeren, Daten, Ende und Schließen. Wenn wir Pipelines verwenden können, um diese Ereignisse effektiv zu integrieren, werden leistungsfähigere interaktive Operationen erreicht.

Durch die Verwendung von .pipe() kann Note mit dem Gegendruck über die Pipeline kommunizieren. Gegendruck bedeutet: nur lesen, was geschrieben werden kann, oder nur schreiben, was lesen kann.

Zum Beispiel senden wir jetzt Daten von stdin an eine lokale Datei und einen Remote-Server:

Code kopieren

Der Code lautet wie folgt: var fs = require('fs'); var net = require('net');
var localFile = fs.createWriteStream('localFile.tmp');

net.connect('255.255.255.255', 12345, function(client) {
process.stdin.pipe(client); Process.stdin.pipe(localFile);

});

Und wenn wir Daten an eine lokale Datei senden und den Stream mit gunzip komprimieren möchten, können wir Folgendes tun:

Code kopieren Der Code lautet wie folgt:

var fs = require('fs');
var zlib = require('zlib');

process.stdin.pipe(zlib.createGunzip()).pipe(fs.createWriteStream('localFile.tar'));

Wenn Sie mehr über Stream erfahren möchten, klicken Sie bitte hier.

Kontrollfluss

Da JS über erstklassige Objekte, Abschlüsse und andere Funktionskonzepte verfügt, können Rückrufberechtigungen einfach definiert werden. Dies ist beim Prototyping sehr praktisch und kann bei Bedarf logische Berechtigungen integrieren. Es erleichtert aber auch die Verwendung umständlicher integrierter Funktionen.

Zum Beispiel möchten wir eine Reihe von Dateien der Reihe nach lesen und dann eine bestimmte Aufgabe ausführen:

Code kopieren Der Code lautet wie folgt:

fs.readFile('firstFile', 'utf8', function firstCb(err, firstFile) {
doSomething(firstFile);
fs.readFile('secondFile', 'utf8', function secondCb(err, secondFile) {
doSomething(secondFile);
fs.readFile('thirdFile', 'utf8', functionthirdCb(err,thirdFile) {
doSomething(thirdFile);
});
});
});

Das Problem bei diesem Modell ist:

1. Die Logik dieser Codes ist sehr verstreut und ungeordnet, und die damit verbundenen Betriebsprozesse sind schwer zu verstehen.
2. Keine Fehler- oder Ausnahmebehandlung.
3. Schließungsspeicherlecks in JS sind sehr häufig und schwer zu diagnostizieren und zu erkennen.

Wenn wir eine Reihe asynchroner Operationen an einem Eingabesatz ausführen möchten, ist die Verwendung einer Flusskontrollbibliothek eine klügere Wahl. Hier kommt Vasync zum Einsatz.

vasync ist eine Prozesssteuerungsbibliothek, deren Idee aus asynchronen Vorgängen stammt. Die Besonderheit besteht darin, dass Verbraucher die Bearbeitung einer bestimmten Aufgabe einsehen und beobachten können. Diese Informationen sind sehr nützlich, um den Entstehungsprozess eines Fehlers zu untersuchen.

Codierungsstil

Der Programmierstil gilt als das umstrittenste Thema, da er oft beiläufig ist. Karotten und Kohl, jeder hat seine eigenen Vorlieben. Wichtig ist, einen Stil zu finden, der sowohl für den Einzelnen als auch für das Team funktioniert. Einige traditionelle Vererbungen können die Node-Entwicklungsreise verbessern.

1. Benennen Sie die Funktion
2. Versuchen Sie, alle Funktionen zu benennen.
3. Vermeiden Sie Schließungen
4. Definieren Sie keine anderen Funktionen innerhalb einer Funktion. Dies kann viele unerwartete Speicherverlustunfälle beim Schließen reduzieren.
5. Mehr und kleinere Funktionen

Obwohl V8 JIT eine leistungsstarke Engine ist, lassen sich kleinere und optimierte Funktionen besser in V8 integrieren. Wenn unsere Funktionen außerdem klein und exquisit sind (ungefähr 100 Zeilen), werden wir es uns selbst danken, wenn wir sie lesen und pflegen.

Stil programmgesteuert prüfen: Behalten Sie die Stilkonsistenz bei und erzwingen Sie sie mit einem Inspektionstool. Wir verwenden jsstyle.

Linting (Code-Inspektion)

Das Lint-Tool kann eine statische Analyse des Codes durchführen, ohne ihn auszuführen, und auf potenzielle Fehler und Risiken prüfen, wie z. B. fehlende Break-Anweisungen bei Case-Switches. Lint ist nicht einfach gleichbedeutend mit einer Stilprüfung, sondern zielt eher auf eine objektive Risikoanalyse als auf eine subjektive Stilauswahl ab. Wir verwenden Javascriptlint, das umfangreiche Prüfelemente enthält.

Protokollierung

Wenn wir programmieren und programmieren, müssen wir eine langfristige Perspektive haben. Überlegen Sie insbesondere, welche Tools Sie zum Debuggen verwenden sollten. Ein ausgezeichneter erster Schritt ist eine effektive Protokollierung. Wir müssen die Informationen identifizieren, um zu sehen, worauf es beim Debuggen besonders zu achten lohnt und was zur Analyse und Forschung während der Laufzeit verwendet wird. Es wird empfohlen, Bunyan zu verwenden, eine direkte Node.jsProtokollierungsbibliothek. Das Datenausgabeformat ist JSON. Für weitere Informationen klicken Sie bitte hier.

Client-Server

Wenn eine Anwendung über verteilte Verarbeitungsfunktionen verfügt, wird sie auf dem Markt attraktiver. Ähnliche Schnittstellen können mit der HTTP-RESTFul-API oder rohem TCP-JSON beschrieben werden. Dadurch können Entwickler ihre Node-Erfahrung mit asynchronen Netzwerkumgebungen und der Verwendung von Streams mit verteilten und skalierbaren Systemen kombinieren.

Häufig verwendete Werkzeuge:

1. restify

Einfach ausgedrückt ist dies ein Tool zum Erstellen von REST-Diensten. Es bietet gute Anzeige- und Debugging-Verarbeitungsunterstützung und unterstützt Bunyan und DTrace.

2. schnell

fast ist ein leichtes Tool, das TCP zur Verarbeitung von JSON-Nachrichten verwendet. Bietet DTrace-Unterstützung, sodass wir Leistungsmerkmale des Server-Clients schnell identifizieren können.

3. Arbeitsablauf

Workflow basiert auf Restify und kann Geschäftsprozesse für eine Reihe von Remote-Diensten und APIs definieren. Zum Beispiel: Fehlerstatus, Zeitüberschreitung, Wiederverbindung, Überlastungsbehandlung usw.

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