Heim Web-Frontend js-Tutorial Einführung in Stream in Node.js_node.js

Einführung in Stream in Node.js_node.js

May 16, 2016 pm 04:07 PM
node.js stream

Was ist Flow?

Apropos Streams: Es handelt sich um ein *nix-Konzept: Pipe – In *nix werden Streams in der Shell als Daten implementiert, die über | (Pipe-Zeichen) überbrückt werden können. Die Ausgabe von a Der Prozess (stdout) kann direkt als Eingabe (stdin) des nächsten Prozesses verwendet werden.

In Node ist das Konzept des Streams (Stream) ähnlich und stellt die Fähigkeit eines Datenstroms dar, überbrückt zu werden.

Rohr

Die Essenz des Streamings liegt in der .pipe()-Methode. Die Fähigkeit zur Überbrückung besteht darin, dass beide Enden des Datenstroms (Upstream/Downstream oder Lese-/Schreibstrom) mit einer .pipe()-Methode überbrückt werden.

Die Ausdrucksform des Pseudocodes ist:

Code kopieren Der Code lautet wie folgt:

//upstream.pipe (downstream)
Readable.pipe(Writable);

Klassifizierung von Streams

Dies ist nicht dazu gedacht, den sogenannten „klassischen“ Ablauf vor Node v0.4 zu diskutieren. Anschließend werden Streams in mehrere Kategorien unterteilt (alle abstrakten Schnittstellen:

).

1.stream.Readable Lesbarer Stream (muss die _read-Methode implementieren, der Schwerpunkt liegt auf den Details des Lesens des Datenstroms
2.stream.Writable Beschreibbarer Stream (muss die _write-Methode implementieren, der Schwerpunkt liegt auf den Details des Schreibens des Datenstroms
3.stream.Duplex Lese-/Schreibstream (muss die beiden oben genannten Schnittstellen implementieren, konzentrieren Sie sich auf die Details der beiden oben genannten Schnittstellen
4.stream.Transform Von Duplex geerbt (muss die _transform-Methode implementieren, der Schwerpunkt liegt auf der Verarbeitung von Datenblöcken

Kurz gesagt:

1) Der Besitzer von .pipe() muss über die Fähigkeit „Lesbarer Stream“ (aber nicht darauf beschränkt) verfügen. Es verfügt über eine Reihe von „lesbaren“/„Daten“/„Ende“/„Schließen“/„Fehler“-Ereignissen Das Abonnement bietet auch eine Reihe von Methoden wie .read()/.pause()/.resume() zum Aufrufen; 2) Die Parameter von .pipe() müssen beschreibbare Stream-Funktionen haben (aber nicht beschränkt auf). Es verfügt über „drain“/„pipe“/„unpipe“/„error“/„finish“-Ereignisse für den Zugriff und bietet auch . Für den Aufruf von
stehen write()/.end() und andere Methoden zur Verfügung

Was zum Teufel

Fühlst du dich ein wenig ängstlich? Machen Sie sich keine Sorgen, als Low-Level-Programmierer, der die menschliche Sprache spricht, werde ich Stream auseinandernehmen und mit Ihnen darüber sprechen.

Die

Stream-Klasse im

Node.js-Quellcode ist wie folgt definiert:

Code kopieren Der Code lautet wie folgt:
var EE = require('events').EventEmitter;
var util = require('util');
util.inherits(Stream, EE);

Funktion Stream() {
EE.call(this);
}

Wie Sie sehen können, ist Stream im Wesentlichen ein EventEmitter, was bedeutet, dass es über ereignisgesteuerte Funktionen verfügt (.emit/.on...). Wie wir alle wissen, ist „Node.js eine ereignisgesteuerte Plattform basierend auf V8“, die ereignisgesteuerte Streaming-Programmierung implementiert und die gleichen asynchronen Rückrufeigenschaften wie Node aufweist.

Zum Beispiel gibt es in einem lesbaren Stream ein lesbares Ereignis. In einem pausierten schreibgeschützten Stream wird ein Datenblock an den Abonnenten gesendet (was sind die lesbaren Streams). ? Express) req, req.part der FTP- oder Multi-Form-Upload-Komponente, Standard-Eingabeprozess.stdin im System usw.). Mit dem lesbaren Ereignis können wir ein Tool wie einen Parser erstellen, der die Shell-Befehlsausgabe verarbeitet:


Code kopieren Der Code lautet wie folgt:
process.stdin.on('readable', function(){
var buf = process.stdin.read();
if(buf){
var data = buf.toString();
// Daten analysieren ...                                                  }
});

Appelez comme ceci :

Copier le code Le code est le suivant :

head -10 some.txt | nœud analyseur.js

Pour un flux lisible, nous pouvons également nous abonner à ses données et mettre fin aux événements pour obtenir des morceaux de données et être averti lorsque le flux est épuisé, comme dans l'exemple de socket classique :

Copier le code Le code est le suivant :

req.on('connect', function(res, socket, head) {
socket.on('data', function(morceau) {
console.log(chunk.toString());
});
socket.on('end', function() {
       proxy.close();
});
});

Changement d'état du flux lisible
Il est à noter que le flux Readable a deux états : le mode flux (torrent) et le mode pause (pause). Le premier ne peut pas s'arrêter du tout et continuera à nourrir celui qui est redirigé ; le second fera une pause jusqu'à ce que l'aval appelle explicitement la requête Stream.read() pour lire le bloc de données. Le flux Readable est en mode pause lors de son initialisation.

Ces deux états peuvent être commutés entre eux, parmi lesquels,

Si l'un des comportements suivants se produit, la pause deviendra fluide :

1. Ajoutez un abonnement à un événement de données au flux Lisible
2. Appelez .resume() sur Readable pour activer explicitement le flux
3. Appelez .pipe(writable) du flux Readable pour établir un pont vers un flux Writable

Si l'un des comportements suivants se produit, le flux reviendra en pause :

1.Le flux lisible n'a encore été redirigé vers aucun flux, .pause() réglable peut être utilisé pour mettre en pause
2. Le flux Readable a été redirigé vers le flux. Vous devez supprimer tous les abonnements aux événements de données et appeler la méthode .unpipe() pour libérer la relation avec le flux en aval un par un

Utilisation merveilleuse

Combiné aux caractéristiques asynchrones du flux, je peux écrire une application comme celle-ci : relier directement la sortie de l'utilisateur A à la sortie sur la page de l'utilisateur B :

Copier le code Le code est le suivant :

router.post('/post', function(req, res) {
var destination = req.headers['destination']; //À qui envoyer
cache[destination] = req;
//Oui, il ne revient pas, il est donc préférable de faire une requête ajax
});

Lorsque l'utilisateur B demande :

Copier le code Le code est le suivant :

router.get('/inbox', function(req, res){
var utilisateur = req.headers['user'];
cache.find(user, function(err, previousReq){ //Rechercher la demande précédemment enregistrée
      var form = new multiparty.Form();
        form.parse(previousReq); // Il y a des fichiers pour moi
       form.on('part', function (partie) {
              part.pipe(res); //La méthode de streaming est bonne :)

              part.on('erreur', fonction (erreur) {
console.log(err);
                 messagerie.setRequestDone(uniqueID);
                     return res.end(err);
            });
        });
});
});

Référence

comment écrire des programmes de nœuds avec des flux : stream-handbook

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Zwei -Punkte -Museum: Alle Exponate und wo man sie finden kann
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ein Artikel über Speichersteuerung in Node Ein Artikel über Speichersteuerung in Node Apr 26, 2023 pm 05:37 PM

Der nicht blockierende und ereignisgesteuerte Knotendienst hat den Vorteil eines geringen Speicherverbrauchs und eignet sich sehr gut für die Verarbeitung massiver Netzwerkanforderungen. Unter der Voraussetzung massiver Anfragen müssen Probleme im Zusammenhang mit der „Speicherkontrolle“ berücksichtigt werden. 1. Der Garbage-Collection-Mechanismus und die Speicherbeschränkungen von V8 Js wird von der Garbage-Collection-Maschine gesteuert

Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Mar 29, 2023 pm 06:02 PM

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Speichers und Garbage Collectors (GC) der NodeJS V8-Engine. Ich hoffe, er wird Ihnen hilfreich sein!

Lassen Sie uns ausführlich über das File-Modul in Node sprechen Lassen Sie uns ausführlich über das File-Modul in Node sprechen Apr 24, 2023 pm 05:49 PM

Das Dateimodul ist eine Kapselung der zugrunde liegenden Dateioperationen, wie z. B. Lesen/Schreiben/Öffnen/Schließen/Löschen von Dateien, Hinzufügen usw. Das größte Merkmal des Dateimoduls besteht darin, dass alle Methoden zwei Versionen von **synchronem** und **bereitstellen. asynchron**, mit Methoden mit dem Suffix sync sind alle Synchronisationsmethoden, und diejenigen ohne sind alle heterogene Methoden.

Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann? Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann? Feb 08, 2023 am 10:09 AM

Der Grund, warum der Knoten den Befehl npm nicht verwenden kann, liegt darin, dass die Umgebungsvariablen nicht richtig konfiguriert sind. Die Lösung ist: 1. Öffnen Sie „Systemeigenschaften“ 2. Suchen Sie nach „Umgebungsvariablen“ -> „Systemvariablen“ und bearbeiten Sie dann die Umgebung Variablen; 3. Suchen Sie den Speicherort des NodeJS-Ordners. 4. Klicken Sie auf „OK“.

Lassen Sie uns über die Ereignisschleife in Node sprechen Lassen Sie uns über die Ereignisschleife in Node sprechen Apr 11, 2023 pm 07:08 PM

Die Ereignisschleife ist ein grundlegender Bestandteil von Node.js und ermöglicht die asynchrone Programmierung, indem sie sicherstellt, dass der Hauptthread nicht blockiert wird. Das Verständnis der Ereignisschleife ist für die Erstellung effizienter Anwendungen von entscheidender Bedeutung. Der folgende Artikel wird Ihnen ein detailliertes Verständnis der Ereignisschleife in Node vermitteln. Ich hoffe, er wird Ihnen hilfreich sein!

So debuggen Sie Java Stream-Vorgänge in IntelliJ IDEA So debuggen Sie Java Stream-Vorgänge in IntelliJ IDEA May 09, 2023 am 11:25 AM

Der Stream-Betrieb ist ein Highlight von Java8! Obwohl java.util.stream sehr leistungsfähig ist, gibt es immer noch viele Entwickler, die es selten in der tatsächlichen Arbeit verwenden. Einer der am häufigsten beklagten Gründe ist, dass es zu Beginn schwierig zu debuggen ist, da Streaming-Vorgänge wie z als Stream kann in DEBUG nicht verwendet werden. Wenn es sich um eine Codezeile handelt, werden im nächsten Schritt tatsächlich viele Vorgänge gleichzeitig übergeben, sodass wir schwer beurteilen können, welche Zeile darin das Problem darstellt. Plug-in: JavaStreamDebugger Wenn die von Ihnen verwendete IDEA-Version relativ neu ist, ist dieses Plug-in bereits enthalten und muss nicht installiert werden. Wenn es noch nicht installiert ist, installieren Sie es manuell und fahren Sie dann unten fort.

Erfahren Sie mehr über Puffer in Node Erfahren Sie mehr über Puffer in Node Apr 25, 2023 pm 07:49 PM

Zu Beginn lief JS nur auf der Browserseite. Es war einfach, Unicode-codierte Zeichenfolgen zu verarbeiten, aber es war schwierig, binäre und nicht Unicode-codierte Zeichenfolgen zu verarbeiten. Und Binär ist das Datenformat der niedrigsten Ebene des Computer-, Video-/Audio-/Programm-/Netzwerkpakets

Ein Artikel über die effiziente Entwicklung von Node.js-Anwendungen auf der Präsentationsebene Ein Artikel über die effiziente Entwicklung von Node.js-Anwendungen auf der Präsentationsebene Apr 17, 2023 pm 07:02 PM

Wie verwende ich Node.js für die Entwicklung von Front-End-Anwendungen? Der folgende Artikel führt Sie in die Methode zur Entwicklung von Front-End-Anwendungen in Node ein, die die Entwicklung von Anwendungen auf der Präsentationsebene umfasst. Die Lösung, die ich heute geteilt habe, ist für einfache Szenarien gedacht. Sie soll es Front-End-Entwicklern ermöglichen, einige einfache serverseitige Entwicklungsaufgaben zu erledigen, ohne zu viel Hintergrundwissen und Fachwissen über Node.js beherrschen zu müssen, selbst wenn sie über keine Programmierkenntnisse verfügen Erfahrung.

See all articles