"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comprendre les flux Node.js : quoi, pourquoi et comment les utiliser

Comprendre les flux Node.js : quoi, pourquoi et comment les utiliser

Publié le 2024-11-09
Parcourir:792

Understanding Node.js Streams: What, Why, and How to Use Them

Les flux Node.js sont une fonctionnalité essentielle pour gérer efficacement de grandes quantités de données. Contrairement aux mécanismes d'entrée-sortie traditionnels, les flux permettent de traiter les données par morceaux plutôt que de charger l'intégralité des données en mémoire, ce qui les rend parfaits pour traiter des fichiers volumineux ou des données en temps réel. Dans cet article, nous approfondirons ce que sont les flux Node.js, pourquoi ils sont utiles, comment les implémenter et différents types de flux avec des exemples détaillés et des cas d'utilisation.

Que sont les flux Node.js ?

En termes simples, un flux est une séquence de données déplacées d'un point à un autre au fil du temps. Vous pouvez le considérer comme un tapis roulant où les données circulent pièce par pièce au lieu d'être toutes en même temps.

Les flux Node.js fonctionnent de la même manière ; ils vous permettent de lire et d'écrire des données par morceaux (au lieu de toutes en même temps), ce qui les rend très efficaces en termes de mémoire.

Les flux dans Node.js sont construits sur EventEmitter, ce qui les rend pilotés par les événements. Quelques événements importants incluent :

  • données : émises lorsque les données sont disponibles pour la consommation.
  • end : émis lorsqu'il n'y a plus de données disponibles à consommer.
  • error : émis lorsqu'une erreur se produit lors de la lecture ou de l'écriture.

Pourquoi utiliser les flux ?

Les flux offrent plusieurs avantages par rapport aux méthodes traditionnelles telles que fs.readFile() ou fs.writeFile() pour la gestion des E/S :

  1. Efficacité de la mémoire : vous pouvez gérer des fichiers très volumineux sans consommer de grandes quantités de mémoire, car les données sont traitées par morceaux.
  2. Performances : les flux fournissent des E/S non bloquantes. Ils permettent de lire ou d'écrire des données pièce par pièce sans attendre la fin de l'opération complète, ce qui rend le programme plus réactif.
  3. Traitement des données en temps réel : les flux permettent le traitement de données en temps réel telles que la vidéo/l'audio en direct ou de grands ensembles de données provenant d'API.

Types de flux dans Node.js

Il existe quatre types de flux dans Node.js :

  1. Flux lisibles : pour lire des données.
  2. Flux inscriptibles : pour écrire des données.
  3. Flux duplex : flux pouvant lire et écrire des données simultanément.
  4. Transform Streams : type de flux duplex où la sortie est une version modifiée de l'entrée (par exemple, compression de données).

Passons en revue chaque type avec des exemples.

1. Flux lisibles

Les flux lisibles sont utilisés pour lire les données morceau par morceau. Par exemple, lors de la lecture d'un fichier volumineux, l'utilisation d'un flux lisible nous permet de lire de petits morceaux de données en mémoire au lieu de charger l'intégralité du fichier.

Exemple : lecture d'un fichier à l'aide d'un flux lisible

const fs = require('fs');

// Create a readable stream
const readableStream = fs.createReadStream('largefile.txt', { encoding: 'utf8' });

// Listen for data events and process chunks
readableStream.on('data', (chunk) => {
  console.log('Chunk received:', chunk);
});

// Listen for the end event when no more data is available
readableStream.on('end', () => {
  console.log('No more data.');
});

// Handle error event
readableStream.on('error', (err) => {
  console.error('Error reading the file:', err);
});

Explication:

  • fs.createReadStream() crée un flux pour lire le fichier en morceaux.
  • L'événement data est déclenché chaque fois qu'un morceau est prêt, et l'événement end est déclenché lorsqu'il n'y a plus de données à lire.

2. Flux inscriptibles

Les flux inscriptibles sont utilisés pour écrire des données morceau par morceau. Au lieu d'écrire toutes les données en même temps, vous pouvez les diffuser dans un fichier ou une autre destination inscriptible.

Exemple : écriture de données à l'aide d'un flux inscriptible

const fs = require('fs');

// Create a writable stream
const writableStream = fs.createWriteStream('output.txt');

// Write chunks to the writable stream
writableStream.write('Hello, World!\n');
writableStream.write('Streaming data...\n');

// End the stream (important to avoid hanging the process)
writableStream.end('Done writing.\n');

// Listen for the finish event
writableStream.on('finish', () => {
  console.log('Data has been written to output.txt');
});

// Handle error event
writableStream.on('error', (err) => {
  console.error('Error writing to the file:', err);
});

Explication:

  • fs.createWriteStream() crée un flux inscriptible.
  • Les données sont écrites dans le flux à l'aide de la méthode write().
  • L'événement finish est déclenché lorsque toutes les données sont écrites et la méthode end() marque la fin du flux.

3. Flux duplex

Les flux duplex peuvent à la fois lire et écrire des données. Un exemple typique de flux duplex est une socket réseau, où vous pouvez envoyer et recevoir des données simultanément.

Exemple : flux duplex

const { Duplex } = require('stream');

const duplexStream = new Duplex({
  write(chunk, encoding, callback) {
    console.log(`Writing: ${chunk.toString()}`);
    callback();
  },
  read(size) {
    this.push('More data');
    this.push(null);  // End the stream
  }
});

// Write to the duplex stream
duplexStream.write('Hello Duplex!\n');

// Read from the duplex stream
duplexStream.on('data', (chunk) => {
  console.log(`Read: ${chunk}`);
});

Explication:

  • Nous définissons une méthode d'écriture pour l'écriture et une méthode de lecture pour la lecture.
  • Les flux duplex peuvent gérer simultanément la lecture et l'écriture.

4. Transformer les flux

Les flux de transformation modifient les données lors de leur passage dans le flux. Par exemple, un flux de transformation peut compresser, chiffrer ou manipuler des données.

Exemple : flux de transformation (texte en majuscules)

const { Transform } = require('stream');

// Create a transform stream that converts data to uppercase
const transformStream = new Transform({
  transform(chunk, encoding, callback) {
    this.push(chunk.toString().toUpperCase());
    callback();
  }
});

// Pipe input to transform stream and then output the result
process.stdin.pipe(transformStream).pipe(process.stdout);

Explication:

  • Les données entrées depuis stdin sont transformées en majuscules par la méthode de transformation, puis sorties vers stdout.

Flux de tuyauterie

L'une des fonctionnalités clés des flux Node.js est leur capacité à être diffusés. Le piping vous permet d'enchaîner des flux ensemble, en passant la sortie d'un flux comme entrée d'un autre.

Exemple : transférer un flux lisible vers un flux inscriptible

const fs = require('fs');

// Create a readable stream for the input file
const readableStream = fs.createReadStream('input.txt');

// Create a writable stream for the output file
const writableStream = fs.createWriteStream('output.txt');

// Pipe the readable stream into the writable stream
readableStream.pipe(writableStream);

// Handle errors
readableStream.on('error', (err) => console.error('Read error:', err));
writableStream.on('error', (err) => console.error('Write error:', err));

Explication:

  • La méthode pipe() connecte le flux lisible au flux inscriptible, envoyant des morceaux de données directement de input.txt à output.txt.

Cas d'utilisation pratique des flux Node.js

  1. Lecture et écriture de fichiers volumineux : au lieu de lire un fichier entier en mémoire, les flux vous permettent de traiter le fichier en petits morceaux.
  2. Traitement des données en temps réel : les flux sont idéaux pour les applications en temps réel telles que le traitement audio/vidéo, les applications de chat ou les flux de données en direct.
  3. Requêtes/Réponses HTTP : les requêtes et réponses HTTP dans Node.js sont des flux, ce qui facilite le traitement des données entrantes ou l'envoi progressif de données.

Conclusion

Les flux Node.js offrent un moyen puissant et efficace de gérer les opérations d'E/S en travaillant avec des données en morceaux. Que vous lisiez des fichiers volumineux, acheminiez des données entre sources ou transformiez des données à la volée, les flux offrent une solution efficace et performante en termes de mémoire. Comprendre comment exploiter les flux lisibles, inscriptibles, duplex et de transformation dans votre application peut améliorer considérablement les performances et l'évolutivité de votre application.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/imsushant12/understanding-nodejs-streams-what-why-and-how-to-use-them-53da?1 En cas de violation, veuillez contacter study_golang@163 .com pour le supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3