Node.js ist eine aufstrebende Backend -Sprache, mit der Programmierer schnell skalierbare Anwendungen aufbauen können. Node.js hat viele attraktive Funktionen, und es gibt unzählige Berichte darüber. In diesem Artikel wird die Funktionen von EventEmitter, Streams, Codierungsstil, Linie, Codierungsstil und anderen analysiert und diskutiert, um Nutzern zu helfen, ein tieferes Verständnis von Node zu haben.js.
Als Plattform, die auf der Chrome JavaScript -Laufzeit basiert, scheint unser relevantes Verständnis von JavaScript für Knotenanwendungen anwendbar zu sein. Ohne zusätzliche Sprachverlängerungen oder -änderungen können wir die Erfahrung der Front-End-Programmierung auf die Back-End-Programmierung anwenden.
EventEmitter (Event -Absender)
Zunächst sollten Sie das Eventemitter -Modell verstehen. Es kann eine Veranstaltung sowie eine Veranstaltung senden, die den Verbraucher interessiert. Wir können es als Erweiterung des Callback -Pass -Musters auf eine asynchrone Funktion betrachten. Insbesondere hat EventEmitter einen weiteren Vorteil, wenn mehrere Rückrufe erforderlich sind.
Ein Anrufer sendet beispielsweise eine "Listendatei" -Anforderung an den 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 "Datei" -Anrufe in jeder Gruppe senden und "End" -Verwicklung durchführen, wenn alle Vorgänge abgeschlossen sind.
Legen Sie bei der Verwendung von EventEmitter einfach die relevanten Ereignisse und Parameter fest.
Die Codekopie lautet wie folgt:
var eventEmitter = required ('events'). eventEmitter;
var util = require ('util');
Funktion myclass () {
if (! (diese Instanz der MyClass)) kehre neue MyClass () zurück;
EventEmitter.call (this);
var self = this;
setTimeout (Funktion timeoutcb () {
self.emit ('Myevent', 'Hallo Welt', 42);
}, 1000);
}
util.inherits (MyClass, Eventemitter);
Der Myclass -Konstruktor erstellt einen Zeitauslöser mit einer Auslöserverzögerung von 1s und einem Auslöserereignis von MyEvent. Um verwandte Ereignisse zu verwenden, müssen Sie die Methode on () ausführen:
Die Codekopie 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);
});
Es sollte hier angemerkt werden, dass zwar das abonnierte EventEmitter -Ereignis ein asynchrones Ereignis ist, wenn die Zeit ausgelöst wird, die Aktionen des Hörers synchronisiert werden. Wenn das oben genannte Myevent -Ereignis 10 Hörer hat, werden alle Zuhörer in Ordnung gerufen, ohne auf die Ereignisschleife zu warten.
Wenn eine Unterklasse von EventEmitter ein E -Ereignis ('Fehler') generiert, aber kein Hörer es abonniert, bringt die EventEmitter -Basisklasse eine Ausnahme aus, was ein UncaugheTexception -Ereignis ausgelöst wird, wenn das Prozessobjekt ausgeführt wird.
Verror
Verror ist eine Erweiterung des Basisklassenfehlers, mit dem wir Ausgabenachrichten mithilfe des Printf -Zeichenformats definieren können.
Streams
Wenn es eine sehr große Datei gibt, die verarbeitet werden muss, sollte die ideale Methode darin bestehen, Teil zu lesen und Teil zu schreiben. Egal wie groß die Datei ist, sie wird immer so lange verarbeitet, wie es die Zeit erlaubt. Dies erfordert das Streaming -Konzept. Streams ist ein weiteres weit verbreitetes Modell im Knoten im Knoten, eine Implementierung von EventEmitter. Bietet lesbare, beschreibbare oder vollständige Duplex -Schnittstellen. Es handelt sich um eine abstrakte Schnittstelle, und die angebotenen regulären Betriebsereignisse umfassen: lesbar, beschreibbar, drain, Daten, Ende und Schließen. Wenn wir Pipelines verwenden können, um diese Ereignisse effektiv zu integrieren, werden leistungsfähigere Interaktionen erreicht.
Durch die Verwendung von .pipe () kann die Notiz über die Pipeline mit Rückdruck kommunizieren. Rückdrucksure bedeutet: nur diejenigen, die geschrieben werden können, oder nur diejenigen, die gelesen werden können.
Zum Beispiel senden wir jetzt Daten von STDIN an eine lokale Datei und einen Remote -Server:
Die Codekopie lautet wie folgt:
var fs = fordert ('fs');
var net = require ('net');
var localfile = fs.createwritestream ('localFile.tmp');
net.connect ('255.255.255.255', 12345, Funktion (Client) {
process.stdin.pipe (client);
process.stdin.pipe (localFile);
});
Und wenn wir Daten an eine lokale Datei senden und Gunzip verwenden möchten, um diesen Stream zu komprimieren, können wir dies tun:
Die Codekopie lautet wie folgt:
var fs = fordert ('fs');
var zlib = required ('zlib');
process.stdin.pipe (zlib.createGunzip ()). Pipe (fs.createwritestream ('localFile.tar'));
Wenn Sie mehr über Stream erfahren möchten, klicken Sie bitte hier.
Steuerfluss (Prozessregelung)
Da JS funktionale Konzepte wie erstklassige Objekte, Schließungen usw. hat, ist es möglich, die Rückrufberechtigungen leicht zu definieren. Dies ist bei Prototypen sehr bequem und kann logische Berechtigungen auf Bedarf integrieren. Es ist jedoch einfach, ungeschickte integrierte Funktionen zu verwenden.
Zum Beispiel möchten wir eine Reihe von Dateien in der Reihenfolge lesen und dann eine Aufgabe ausführen:
Die Codekopie lautet wie folgt:
fs
DOSOME (FIRSTFILE);
fs
Dosen (Secondfile);
fs
DOSOME (ThirdFile);
});
});
});
Die Probleme mit diesem Muster sind:
1. Die Logik dieser Codes ist sehr verstreut und ungeordnet, und die damit verbundenen Betriebsprozesse sind schwer zu verstehen.
2. Es werden keine Fehler oder Ausnahmen behandelt.
3.. Verschlussspeicherlecks in JS sind sehr häufig und schwer zu diagnostizieren und zu erkennen.
Wenn wir eine Reihe von asynchronen Operationen in einem Eingangssatz ausführen möchten, ist die Verwendung einer Prozesssteuerungsbibliothek eine intelligentere Wahl. Vasync wird hier verwendet.
Vasync ist eine Prozesskontrollbibliothek, deren Ideen aus asynchronen Operationen stammen. Was es besonders macht, ist, dass Verbraucher einen bestimmten Aufgabenprozess betrachten und beobachten können. Diese Informationen sind sehr nützlich, um den Prozess eines bestimmten Fehlers zu untersuchen.
Codierungsstil (Programmierstil)
Der Programmierstil ist das umstrittenste Thema, da er oft lässig ist. Jeder hat seine eigenen Vorlieben. Es ist wichtig, einen Stil zu finden, der Einzelpersonen und Teams entspricht. Ein traditionelles Erbe kann die Knotenentwicklungsreise zu einem besseren Ort machen.
1. Nennen Sie die Funktion
2. Versuchen Sie, alle Funktionen zu benennen.
3. Vermeiden Sie Schließungen
4. Definieren Sie andere Funktionen in einer bestimmten Funktion nicht. Dies reduziert viele unerwartete Unfälle für Lecksaugen von Verschlussspeichern.
5. Mehr und kleinere Funktionen
Obwohl V8 JIT ein starker Motor ist, werden kleinere und dünnere Funktionen besser mit V8 kombiniert. Wenn unsere Funktionen alle klein und exquisit sind (ungefähr 100 Zeilen), werden wir uns auch bei uns bedanken, wenn wir sie selbst lesen und aufrechterhalten.
Überprüfen Sie den Stil programmgesteuert: Behalten Sie die Stilkonsistenz bei und verwenden Sie ein Check -Tool, um diese zu verbessern. Wir verwenden JStyle.
LINTING (CODE -Überprüfung)
Das Lint -Tool kann eine statische Analyse des Codes durchführen, ohne auszuführen, und prüft potenzielle Fehler und Risiken, z. Lint entspricht nicht einfach der Stilprüfung, sondern auch eher auf objektive Risikoanalysen als auf subjektive Stilentscheidungen. Wir verwenden JavaScriptLint, das reichhaltige Prüfelemente hat.
Protokollierung (Protokollierung)
Wenn wir programmieren und codieren, müssen wir eine langfristige Sicht haben. Überlegen Sie sich insbesondere, welche Tools zum Debuggen verwendet werden sollen. Der hervorragende erste Schritt besteht darin, eine effektive Protokollierung durchzuführen. Wir müssen die Informationen identifizieren und sehen, was beim Debuggen besonders aufmerksam wird und was zur Analyse und Forschung zur Laufzeit verwendet wird. Es wird empfohlen, Bunyan, eine Direct Node.JS -Protokollierungsbibliothek, zu verwenden, und das Datenausgangsformat ist JSON. Weitere Informationen finden Sie hier.
Client -Server
Wenn eine Anwendung verteilte Verarbeitungsfunktionen hat, wird sie auf dem Markt attraktiver sein. Ähnliche Schnittstellen können unter Verwendung der HTTP RESTful API oder des ursprünglichen TCP JSON beschrieben werden. Auf diese Weise können Entwickler Erfahrung auf dem Knoten mit asynchronen Netzwerkumgebungen sowie die Verwendung von Streams mit verteilten und skalierbaren Systemen kombinieren.
Gemeinsame Werkzeuge:
1. restify
Einfach ausgedrückt ist dies ein Werkzeug zum Erstellen von Rastdiensten. Es bietet gute Unterstützung und Debugging -Unterstützung und unterstützt Bunyan und Dtrace.
2. schnell
Fast ist ein leichtes Tool, mit dem TCP JSON -Nachrichten verarbeitet. Es wird eine DTRACE -Unterstützung bereitgestellt, mit der wir die Leistungsmerkmale von Serverclients schnell identifizieren können.
3. Workflow
Der Workflow basiert auf der Wiederherstellung und kann Geschäftsprozesse für eine Reihe von Remote -Diensten und APIs definieren. Zum Beispiel: Fehlerstatus, Zeitüberschreitung, Wiederverbindung, Überlastungsverarbeitung usw.