Maison interface Web js tutoriel Introduction à Stream dans Node.js_node.js

Introduction à Stream dans Node.js_node.js

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

Qu’est-ce que le flux ?

En parlant de flux, cela implique un concept *nix : Pipe - Dans *nix, les flux sont implémentés dans le Shell en tant que données qui peuvent être pontées via | (caractère pipe), a La sortie d'un Le processus (stdout) peut être directement utilisé comme entrée (stdin) du processus suivant.

Dans Node, le concept de flux (Stream) est similaire, représentant la capacité d'un flux de données à être ponté.

tuyau

L'essence du streaming réside dans la méthode .pipe(). La possibilité de ponter réside dans le fait que les deux extrémités du flux de données (flux amont/aval ou lecture/écriture) sont pontées avec une méthode .pipe().

La forme d'expression du pseudo-code est :

Copier le code Le code est le suivant :

//upstream.pipe (en aval)
Readable.pipe(Inscriptible);

Classification des flux

Ceci n'a pas pour but d'aborder le flux dit "classique" avant Node v0.4. Ensuite, les flux sont répartis en plusieurs catégories (toutes les interfaces abstraites :

1.stream.Readable Flux lisible (doit implémenter la méthode _read, l'accent est mis sur les détails de la lecture du flux de données
2.stream.Writable Flux inscriptible (nécessite d'implémenter la méthode _write, l'accent est mis sur les détails de l'écriture du flux de données
3.stream.Duplex Flux de lecture/écriture (doit implémenter les deux interfaces ci-dessus, concentrez-vous sur les détails des deux interfaces ci-dessus
4.stream.Transform Hérité de Duplex (nécessite d'implémenter la méthode _transform, l'accent est mis sur le traitement des blocs de données

En bref :

1) Le propriétaire de .pipe() doit avoir la capacité de flux lisible (mais sans s'y limiter). Il dispose d'une série d'événements 'readable'/'data'/'end'/'close'/'error' pour. L'abonnement fournit également une série de méthodes telles que .read()/.pause()/.resume() pour appeler
 ; 2) Les paramètres de .pipe() doivent avoir des capacités de flux inscriptibles (mais sans s'y limiter). Il a des événements 'drain'/'pipe'/'unpipe'/'error'/'finish' pour l'accès et fournit également . write ()/.end() et d'autres méthodes sont disponibles pour appeler

C'est quoi ce bordel

Vous sentez-vous un peu anxieux ? Ne vous inquiétez pas, en tant que codeur de bas niveau parlant un langage humain, je vais décomposer Stream et vous en parler.

La classe

Stream, dans le code source de Node.js , est définie comme suit :

Copier le code Le code est le suivant :

var EE = require('events').EventEmitter;
var util = require('util');
util.inherits(Stream, EE);

fonction Flux() {
EE.call(this);
>

Comme vous pouvez le voir, essentiellement, Stream est un EventEmitter, ce qui signifie qu'il possède des fonctions basées sur les événements (.emit/.on...). Comme nous le savons tous, "Node.js est une plate-forme événementielle basée sur V8", qui implémente une programmation de streaming événementielle et possède les mêmes caractéristiques de rappel asynchrone que Node.

Par exemple, dans un flux Lisible, il y a un événement lisible. Dans un flux en lecture seule en pause, tant qu'un bloc de données est prêt à être lu, il sera envoyé à l'abonné (quels sont les flux Lisibles). ? Express) req, req.part du composant de téléchargement ftp ou multi-forme, processus d'entrée standard.stdin dans le système, etc.). Avec l'événement readable, nous pouvons créer un outil tel qu'un analyseur qui traite la sortie de la commande shell :

Copier le code Le code est le suivant :

process.stdin.on('readable', function(){
var buf = process.stdin.read();
si(buf){
var data = buf.toString();
// analyse des données ...                                                   >
});

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Un article pour parler du contrôle de la mémoire dans Node Un article pour parler du contrôle de la mémoire dans Node Apr 26, 2023 pm 05:37 PM

Le service Node construit sur une base non bloquante et piloté par les événements présente l'avantage d'une faible consommation de mémoire et est très adapté à la gestion de requêtes réseau massives. Dans le contexte de demandes massives, les questions liées au « contrôle de la mémoire » doivent être prises en compte. 1. Le mécanisme de récupération de place du V8 et les limitations de mémoire Js sont contrôlés par la machine de récupération de place

Explication graphique détaillée de la mémoire et du GC du moteur Node V8 Explication graphique détaillée de la mémoire et du GC du moteur Node V8 Mar 29, 2023 pm 06:02 PM

Cet article vous donnera une compréhension approfondie de la mémoire et du garbage collector (GC) du moteur NodeJS V8. J'espère qu'il vous sera utile !

Parlons en profondeur du module File dans Node Parlons en profondeur du module File dans Node Apr 24, 2023 pm 05:49 PM

Le module de fichiers est une encapsulation des opérations de fichiers sous-jacentes, telles que l'ajout de lecture/écriture/ouverture/fermeture/suppression de fichiers, etc. La plus grande caractéristique du module de fichiers est que toutes les méthodes fournissent deux versions de **synchrone** et ** asynchrone**, with Les méthodes avec le suffixe sync sont toutes des méthodes de synchronisation, et celles qui n'en ont pas sont toutes des méthodes hétérogènes.

Parlons de la boucle d'événements dans Node Parlons de la boucle d'événements dans Node Apr 11, 2023 pm 07:08 PM

La boucle d'événements est un élément fondamental de Node.js et permet une programmation asynchrone en garantissant que le thread principal n'est pas bloqué. Comprendre la boucle d'événements est crucial pour créer des applications efficaces. L'article suivant vous donnera une compréhension approfondie de la boucle d'événements dans Node. J'espère qu'il vous sera utile !

Que dois-je faire si le nœud ne peut pas utiliser la commande npm ? Que dois-je faire si le nœud ne peut pas utiliser la commande npm ? Feb 08, 2023 am 10:09 AM

La raison pour laquelle le nœud ne peut pas utiliser la commande npm est que les variables d'environnement ne sont pas configurées correctement. La solution est la suivante : 1. Ouvrez "Propriétés système" ; 2. Recherchez "Variables d'environnement" -> "Variables système", puis modifiez l'environnement. variables ; 3. Recherchez l'emplacement du dossier nodejs ; 4. Cliquez sur "OK".

Comment déboguer les opérations Java Stream dans IntelliJ IDEA Comment déboguer les opérations Java Stream dans IntelliJ IDEA May 09, 2023 am 11:25 AM

Le fonctionnement du flux est un point fort de Java8 ! Bien que java.util.stream soit très puissant, de nombreux développeurs l'utilisent encore rarement dans leur travail réel. L'une des raisons les plus critiquées est qu'il est difficile à déboguer. C'était effectivement le cas au début, à cause des opérations de streaming. car le flux ne peut pas être utilisé dans DEBUG Lorsqu'il s'agit d'une ligne de code, lorsqu'il s'agit de l'étape suivante, de nombreuses opérations sont en fait passées en même temps, il nous est donc difficile de juger quelle ligne pose problème. Plug-in : JavaStreamDebugger Si la version d'IDEA que vous utilisez est relativement nouvelle, ce plug-in est déjà inclus et n'a pas besoin d'être installé. S'il n'est pas encore installé, installez-le manuellement, puis continuez ci-dessous.

En savoir plus sur les tampons dans Node En savoir plus sur les tampons dans Node Apr 25, 2023 pm 07:49 PM

Au début, JS ne fonctionnait que du côté du navigateur. Il était facile de traiter les chaînes codées en Unicode, mais il était difficile de traiter les chaînes binaires et non codées en Unicode. Et le binaire est le format de données le plus bas du package ordinateur, vidéo/audio/programme/réseau.

Un article pour expliquer comment développer efficacement des applications Node.js de couche de présentation Un article pour expliquer comment développer efficacement des applications Node.js de couche de présentation Apr 17, 2023 pm 07:02 PM

Comment utiliser Node.js pour le développement d’applications front-end ? L'article suivant vous présentera la méthode de développement d'applications frontales dans Node, qui implique le développement d'applications de couche de présentation. La solution que j'ai partagée aujourd'hui concerne des scénarios simples. Elle est conçue pour permettre aux développeurs front-end d'effectuer certaines tâches simples de développement côté serveur sans avoir à maîtriser trop de connaissances de base et de connaissances professionnelles sur Node.js, même s'ils n'ont pas de codage. expérience.

See all articles