182

smtp-protocolSMTP電子メールをキャプチャしてメールデータを処理するために使用するノードプログラムをハッキングしています。ライブラリはメールデータをストリームとして提供しますが、それを文字列に変換する方法がわかりません。

現在、stdoutに書き込みを行っていますstream.pipe(process.stdout, { end: false })が、前述したように、代わりに文字列のストリームデータが必要です。これは、ストリームが終了したら使用できます。

Node.jsストリームからすべてのデータを文字列に収集するにはどうすればよいですか?

4

18 に答える 18

82

上記のどれも私にとってはうまくいきませんでした。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));
  });
于 2016-02-21T00:02:08.837 に答える
66

これが上記の回答よりも役立つことを願っています:

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

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

文字列連結は、文字列部分を収集するための最も効率的な方法ではありませんが、単純化のために使用されていることに注意してください (おそらく、コードは効率を気にしません)。

また、このコードは、ASCII 以外のテキストに対して予測できないエラーを引き起こす可能性があります (すべての文字が 1 バイトに収まると想定しています) が、おそらくそれも気にしないでしょう。

于 2014-09-27T15:08:22.453 に答える
55

(この回答は、何年も前の最良の回答でした。この下に、より良い回答があります。node.jsについていくことができず、「この質問に正解」とマークされているため、この回答を削除できません。 "。ダウンクリックを考えている場合、私に何をしてもらいたいですか?)

重要なのは、読み取り可能なストリームdataのイベントとendイベントを使用することです。これらのイベントを聞いてください:

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

イベントを受信したらdata、データを収集するために作成されたバッファーにデータの新しいチャンクを追加します。

イベントを受信しendたら、必要に応じて、完成したバッファを文字列に変換します。次に、それを使って必要なことをします。

于 2012-05-16T17:51:46.567 に答える
22

私は通常、この単純な関数を使用してストリームを文字列に変換しています:

function streamToString(stream, cb) {
  const chunks = [];
  stream.on('data', (chunk) => {
    chunks.push(chunk.toString());
  });
  stream.on('end', () => {
    cb(chunks.join(''));
  });
}

使用例:

let stream = fs.createReadStream('./myFile.foo');
streamToString(stream, (data) => {
  console.log(data);  // data is now my string variable
});
于 2015-09-14T12:59:04.027 に答える
0

おそらくプロジェクトの依存関係にすでにある非常に人気のあるstream-buffersパッケージを使用すると、これは非常に簡単です。

// imports
const { WritableStreamBuffer } = require('stream-buffers');
const { promisify } = require('util');
const { createReadStream } = require('fs');
const pipeline = promisify(require('stream').pipeline);

// sample stream
let stream = createReadStream('/etc/hosts');

// pipeline the stream into a buffer, and print the contents when done
let buf = new WritableStreamBuffer();
pipeline(stream, buf).then(() => console.log(buf.getContents().toString()));
于 2018-09-11T04:30:25.717 に答える