129 votes

Comment fermer un flux lisible (avant la fin) ?

Comment fermer un flux lisible dans Node.js ?

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   // une fois le flux fermé, cette partie du code ne sera
   // plus exécutée

   if (gotFirstLine) {
      // fermer ce flux et continuer les
      // instructions à partir d'ici
      console.log("Fermé.");
   }
});

Ce serait mieux que :

input.on('data', function(data) {
   if (isEnded) { return; }

   if (gotFirstLine) {
      isEnded = true;
      console.log("Fermé.");
   }
});

Mais cela n'arrêterait pas le processus de lecture...

7voto

Rocco Musolino Points 187

Ce module destroy est conçu pour s'assurer qu'un flux soit détruit, en gérant différentes APIs et bugs de Node.js. En ce moment, c'est l'un des meilleurs choix.

Remarque : À partir de Node 10, vous pouvez utiliser la méthode .destroy sans autres dépendances.

3voto

Sayem Points 304

Vous pouvez vider et fermer le flux avec votrestream.resume(), ce qui va vider tout sur le flux et éventuellement le fermer.

À partir du docs officiels:

readable.resume():

Renvoi: this

Cette méthode provoquera l'émission d'événements 'data' par le flux lisible.

Cette méthode mettra le flux en mode flux. Si vous ne souhaitez pas consommer les données d'un flux, mais que vous souhaitez tout de même atteindre l'événement 'end', vous pouvez appeller stream.resume() pour ouvrir le flux de données.

var readable = getReadableStreamSomehow();
readable.resume();
readable.on('end', () => {
  console.log('arrivé à la fin, mais n'a rien lu');
});

3voto

Vexter Points 1121

C'est une vieille question mais je cherchais aussi la réponse et j'ai trouvé la meilleure pour mon implémentation. Les événements end et close sont émis donc je pense que c'est la solution la plus propre.

Cela fera l'affaire dans node 4.4.* (version stable au moment de l'écriture) :

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   if (gotFirstLine) {
      this.end(); // Simple n'est-ce pas?
      console.log("Fermé.");
   }
});

Pour une explication très détaillée, voir : http://www.bennadel.com/blog/2692-you-have-to-explicitly-end-streams-after-pipes-break-in-node-js.htm

2voto

user1500191 Points 354

Ce code ici fera parfaitement l'affaire :

function closeReadStream(stream) {
    if (!stream) return;
    if (stream.close) stream.close();
    else if (stream.destroy) stream.destroy();
}

writeStream.end() est le moyen privilégié de fermer un writeStream...

0voto

MalaviyRavi Points 11

Pour arrêter l'exécution du rappel après quelques appels, vous devez utiliser process.kill avec un identifiant de processus particulier

const csv = require('csv-parser');
const fs = require('fs');

const filepath = "./demo.csv"
let readStream = fs.createReadStream(filepath, {
    autoClose: true,
});
let MAX_LINE = 0;

readStream.on('error', (e) => {
        console.log(e);
        console.log("error");
    })

    .pipe(csv())
    .on('data', (row) => {

        if (MAX_LINE == 2) {
            process.kill(process.pid, 'SIGTERM')
        }
        // console.log("not 2");
        MAX_LINE++
        console.log(row);
    })

    .on('end', () => {
        // gérer la fin du CSV
        console.log("lecture terminée");
    }).on("close", function () {
        console.log("fermé");
    })

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X