191 votes

Comment lire le contenu d'un flux Node.js dans une variable de type chaîne ?

Je suis en train de pirater un programme Node qui utilise smtp-protocol pour capturer les courriers électroniques SMTP et agir sur les données du courrier. La bibliothèque fournit les données de courrier sous forme de flux, et je ne sais pas comment les transformer en chaîne.

Je suis en train de l'écrire dans la sortie stdout avec stream.pipe(process.stdout, { end: false }) mais comme je l'ai dit, j'ai besoin des données du flux dans une chaîne à la place, que je peux utiliser une fois que le flux est terminé.

Comment collecter toutes les données d'un flux Node.js dans une chaîne de caractères ?

279voto

Marlon Bernardes Points 2844

Une autre façon serait de convertir le flux en une promesse (se référer à l'exemple ci-dessous) et utiliser then (ou await ) pour affecter la valeur résolue à une variable.

function streamToString (stream) {
  const chunks = [];
  return new Promise((resolve, reject) => {
    stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
    stream.on('error', (err) => reject(err));
    stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
  })
}

const result = await streamToString(stream)

83voto

Ricky Points 613

Aucune des propositions ci-dessus n'a fonctionné pour moi. J'avais besoin d'utiliser l'objet Buffer :

  const chunks = [];

  readStream.on("data", function (chunk) {
    chunks.push(chunk);
  });

  // Send the buffer or you can put it into a var
  readStream.on("end", function () {
    res.send(Buffer.concat(chunks));
  });

66voto

Tom Carchrae Points 3322

J'espère que cette réponse est plus utile que la réponse ci-dessus :

var string = '';
stream.on('data',function(data){
  string += data.toString();
  console.log('stream data ' + part);
});

stream.on('end',function(){
  console.log('final output ' + string);
});

Notez que la concaténation de chaînes de caractères n'est pas la manière la plus efficace de rassembler les parties de chaîne, mais elle est utilisée pour des raisons de simplicité (et peut-être que votre code ne se soucie pas de l'efficacité).

De plus, ce code peut produire des échecs imprévisibles pour les textes non-ASCII (il suppose que chaque caractère tient dans un octet), mais peut-être que cela ne vous intéresse pas non plus.

61voto

Traycho Ivanov Points 1678

Que pensez-vous de cela ?

async function streamToString(stream) {
    // lets have a ReadableStream as a stream variable
    const chunks = [];

    for await (const chunk of stream) {
        chunks.push(Buffer.from(chunk));
    }

    return Buffer.concat(chunks).toString("utf-8");
}

57voto

ControlAltDel Points 7430

(Cette réponse date d'il y a des années, quand c'était la meilleure réponse. Il y a maintenant une meilleure réponse en dessous de celle-ci. Je n'ai pas suivi l'évolution de node.js, et je ne peux pas supprimer cette réponse car elle est marquée "correcte pour cette question". Si vous envisagez de cliquer en bas, que voulez-vous que je fasse ?)

La clé est d'utiliser le data y end les événements d'une Flux lisible . Écoutez ces événements :

stream.on('data', (chunk) => { ... });
stream.on('end', () => { ... });

Lorsque vous recevez le data ajoute le nouveau morceau de données à un tampon créé pour collecter les données.

Lorsque vous recevez le end convertit le tampon complété en une chaîne de caractères, si nécessaire. Ensuite, faites ce que vous avez besoin de faire avec.

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