Découvrez à quoi servent les flux, pourquoi sont-ils si importants et comment les utiliser.
- Que sont les flux
- Pourquoi streams
- Un exemple de flux
- tuyau()
- API de nœuds alimentées par Streams
- Différents types de flux
- Comment créer un flux lisible
- Comment créer un flux inscriptible
- Comment obtenir des données à partir d'un flux lisible
- Comment envoyer des données vers un flux inscriptible
- Signaler un flux inscriptible que vous avez terminé d'écrire
Que sont les flux
Les flux sont l'un des concepts fondamentaux qui alimentent les applications Node.js.
Ils sont un moyen de gérer efficacement la lecture / l'écriture de fichiers, les communications réseau ou tout autre type d'échange d'informations de bout en bout.
Les flux ne sont pas un concept propre à Node.js. Ils ont été introduits dans le système d'exploitation Unix il y a des décennies, et les programmes peuvent interagir les uns avec les autres en passant des flux via l'opérateur de canal (|
).
Par exemple, de manière traditionnelle, lorsque vous dites au programme de lire un fichier, le fichier est lu en mémoire, du début à la fin, puis vous le traitez.
En utilisant des flux, vous le lisez morceau par morceau, en traitant son contenu sans tout garder en mémoire.
Le Node.jsstream
modulefournit la base sur laquelle toutes les API de streaming sont construites.
Pourquoi streams
Les flux offrent essentiellement deux avantages majeurs en utilisant d'autres méthodes de traitement des données:
- Efficacité de la mémoire: vous n'avez pas besoin de charger de grandes quantités de données en mémoire avant de pouvoir les traiter
- L'efficacité du temps: il faut beaucoup moins de temps pour commencer à traiter les données dès que vous les avez, plutôt que d'attendre que toute la charge utile de données soit disponible pour démarrer
Un exemple de flux
Un exemple typique est celui de la lecture de fichiers à partir d'un disque.
Utilisation du nœudfs
module, vous pouvez lire un fichier et le servir via HTTP lorsqu'une nouvelle connexion est établie avec votre serveur http:
const http = require('http')
const fs = require('fs')
const server = http.createServer(function (req, res) {
fs.readFile(__dirname + ‘/data.txt’, (err, data) => {
res.end(data)
})
})
server.listen(3000)
readFile()
lit le contenu complet du fichier et appelle la fonction de rappel une fois terminé.
res.end(data)
dans le rappel retournera le contenu du fichier au client HTTP.
Si le fichier est volumineux, l'opération prendra un peu de temps. Voici la même chose écrite à l'aide de flux:
const http = require('http')
const fs = require('fs')
const server = http.createServer((req, res) => {
const stream = fs.createReadStream(__dirname + ‘/data.txt’)
stream.pipe(res)
})
server.listen(3000)
Au lieu d'attendre que le fichier soit entièrement lu, nous commençons à le diffuser vers le client HTTP dès que nous avons un morceau de données prêt à être envoyé.
tuyau()
L'exemple ci-dessus utilise la lignestream.pipe(res)
: lepipe()
est appelée sur le flux de fichiers.
Que fait ce code? Il prend la source et la dirige vers une destination.
Vous l'appelez sur le flux source, donc dans ce cas, le flux de fichier est redirigé vers la réponse HTTP.
La valeur de retour dupipe()
method est le flux de destination, ce qui est très pratique qui nous permet de chaînerpipe()
appels, comme ceci:
src.pipe(dest1).pipe(dest2)
Cette construction équivaut à faire
src.pipe(dest1)
dest1.pipe(dest2)
API de nœuds alimentées par Streams
En raison de leurs avantages, de nombreux modules de base Node.js offrent des capacités de gestion de flux natives, notamment:
process.stdin
renvoie un flux connecté à stdinprocess.stdout
renvoie un flux connecté à stdoutprocess.stderr
renvoie un flux connecté à stderrfs.createReadStream()
crée un flux lisible dans un fichierfs.createWriteStream()
crée un flux inscriptible dans un fichiernet.connect()
lance une connexion basée sur le fluxhttp.request()
renvoie une instance de la classe http.ClientRequest, qui est un flux accessible en écriturezlib.createGzip()
compresser les données à l'aide de gzip (un algorithme de compression) dans un fluxzlib.createGunzip()
décompressez un flux gzip.zlib.createDeflate()
compresser les données à l'aide de deflate (un algorithme de compression) dans un fluxzlib.createInflate()
décompresser un flux dégonflé
Différents types de flux
Il existe quatre classes de flux:
Readable
: un flux à partir duquel vous pouvez canaliser, mais pas dans lequel vous pouvez canaliser (vous pouvez recevoir des données, mais pas y envoyer). Lorsque vous envoyez des données dans un flux lisible, elles sont mises en mémoire tampon, jusqu'à ce qu'un consommateur commence à lire les données.Writable
: un flux dans lequel vous pouvez canaliser, mais pas depuis (vous pouvez envoyer des données, mais pas en recevoir)Duplex
: un flux dans lequel vous pouvez à la fois canaliser et diriger, essentiellement une combinaison d'un flux lisible et inscriptibleTransform
: un flux de transformation est similaire à un duplex, mais la sortie est une transformation de son entrée
Comment créer un flux lisible
Nous obtenons le flux lisible dustream
module, et nous l'initialisons
const Stream = require('stream')
const readableStream = new Stream.Readable()
Maintenant que le flux est initialisé, nous pouvons lui envoyer des données:
readableStream.push('hi!')
readableStream.push('ho!')
Comment créer un flux inscriptible
Pour créer un flux inscriptible, nous étendons la baseWritable
object, et nous implémentons sa méthode _write ().
Créez d'abord un objet de flux:
const Stream = require('stream')
const writableStream = new Stream.Writable()
puis implémenter_write
:
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
Vous pouvez maintenant diriger un flux lisible dans:
process.stdin.pipe(writableStream)
Comment obtenir des données à partir d'un flux lisible
Comment lisons-nous les données d'un flux lisible? Utilisation d'un flux inscriptible:
const Stream = require('stream')
const readableStream = new Stream.Readable()
const writableStream = new Stream.Writable()
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
readableStream.pipe(writableStream)
readableStream.push(‘hi!’)
readableStream.push(‘ho!’)
Vous pouvez également consommer un flux lisible directement, en utilisant lereadable
un événement:
readableStream.on('readable', () => {
console.log(readableStream.read())
})
Comment envoyer des données vers un flux inscriptible
Utiliser le fluxwrite()
méthode:
writableStream.write('hey!\n')
Signaler un flux inscriptible que vous avez terminé d'écrire
Utilisez leend()
méthode:
const Stream = require('stream')
const readableStream = new Stream.Readable()
const writableStream = new Stream.Writable()
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
readableStream.pipe(writableStream)
readableStream.push(‘hi!’)
readableStream.push(‘ho!’)
writableStream.end()
Téléchargez mon gratuitManuel de Node.js
Plus de didacticiels sur les nœuds:
- Une introduction au gestionnaire de paquets npm
- Introduction à Node.js
- Requêtes HTTP utilisant Axios
- Où héberger une application Node.js
- Interagissez avec l'API Google Analytics à l'aide de Node.js
- Le lanceur de package npx Node
- Le guide package.json
- Où npm installe-t-il les packages?
- Comment mettre à jour Node.js
- Comment utiliser ou exécuter un package installé à l'aide de npm
- Le fichier package-lock.json
- Gestion des versions sémantiques à l'aide de npm
- Devez-vous valider le dossier node_modules dans Git?
- Mettez à jour toutes les dépendances de nœud vers leur dernière version
- Analyser JSON avec Node.js
- Rechercher la version installée d'un package npm
- Flux Node.js
- Installer une ancienne version d'un package npm
- Obtenir le dossier actuel dans Node
- Comment enregistrer un objet dans Node
- Exposer la fonctionnalité d'un fichier Node à l'aide d'export
- Différences entre Node et le navigateur
- Faire une requête HTTP POST à l'aide de Node
- Obtenir les données du corps de la requête HTTP à l'aide de Node
- Tampons de nœud
- Une brève histoire de Node.js
- Comment installer Node.js
- Quelle quantité de JavaScript devez-vous connaître pour utiliser Node?
- Comment utiliser le REPL Node.js
- Nœud, accepter les arguments de la ligne de commande
- Sortie vers la ligne de commande à l'aide de Node
- Accepter l'entrée de la ligne de commande dans Node
- Désinstaller les packages npm avec `npm uninstall`
- packages mondiaux ou locaux npm
- dépendances npm et devDependencies
- La boucle d'événements Node.js
- Comprendre process.nextTick ()
- Comprendre setImmediate ()
- L'émetteur d'événement de nœud
- Construire un serveur HTTP
- Faire des requêtes HTTP avec Node
- Le module Node fs
- Requêtes HTTP dans Node utilisant Axios
- Lire des fichiers avec Node
- Chemins de fichiers de noeud
- Écriture de fichiers avec Node
- Statistiques du fichier de nœud
- Utilisation des descripteurs de fichiers dans Node
- Travailler avec des dossiers dans Node
- Le module de chemin de nœud
- Le module Node http
- Utilisation de WebSockets avec Node.js
- Les bases de l'utilisation de MySQL et de Node
- Gestion des erreurs dans Node.js
- Le guide du carlin
- Comment lire les variables d'environnement à partir de Node.js
- Comment quitter un programme Node.js
- Le module Node OS
- Le module d'événements Node
- Node, la différence entre développement et production
- Comment vérifier si un fichier existe dans Node.js
- Comment créer un fichier vide dans Node.js
- Comment supprimer un fichier avec Node.js
- Comment obtenir la dernière date de mise à jour d'un fichier à l'aide de Node.js
- Comment déterminer si une date est aujourd'hui en JavaScript
- Comment écrire un objet JSON dans un fichier dans Node.js
- Pourquoi devriez-vous utiliser Node.js dans votre prochain projet?
- Exécutez un serveur Web à partir de n'importe quel dossier
- Comment utiliser MongoDB avec Node.js
- Utilisez Chrome DevTools pour déboguer une application Node.js
- Qu'est-ce que pnpm?
- Liste des options de Node.js Runtime v8
- Comment corriger l'erreur "Accès en écriture manquant" lors de l'utilisation de npm
- Comment activer les modules ES dans Node.js
- Comment générer un processus enfant avec Node.js
- Comment obtenir à la fois du corps analysé et du corps brut dans Express
- Comment gérer les téléchargements de fichiers dans Node.js
- Que sont les dépendances homologues dans un module Node?
- Comment écrire un fichier CSV avec Node.js
- Comment lire un fichier CSV avec Node.js
- Les modules Node Core
- Incrémenter plusieurs numéros de dossiers à la fois à l'aide de Node.js
- Comment imprimer un canevas sur une URL de données
- Comment créer et enregistrer une image avec Node.js et Canvas
- Comment télécharger une image à l'aide de Node.js
- Comment renommer en masse des fichiers dans Node.js
- Comment obtenir les noms de tous les fichiers d'un dossier dans Node
- Comment utiliser les promesses et attendre avec les fonctions basées sur le rappel de Node.js
- Comment tester un package npm localement
- Comment vérifier la version actuelle de Node.js au moment de l'exécution
- Comment utiliser Sequelize pour interagir avec PostgreSQL
- Servir une page HTML à l'aide de Node.js
- Comment résoudre l'erreur `util.pump n'est pas une fonction` dans Node.js