将node.jsstream写入一个stringvariables

我正在攻击一个能够捕获SMTP邮件并对邮件数据执行操作的node.js程序。 “smtp协议”节点库将邮件数据作为stream提供,并作为node.js新手我不知道如何将该stream写入stringvariables。 我现在有写到标准输出使用该行:

stream.pipe(process.stdout, { end : false }); 

正如我所说的,我需要将这个stream数据写入一个stringvariables,然后在stream结束后再使用它。

非常感谢!

关键是要使用这两个stream事件 :

  • 事件:'数据'
  • 事件:'结束'

对于stream.on('data', ...)您应该将数据数据收集到Buffer(如果是二进制)或string中。

对于on('end', ...)你应该调用你完成的缓冲区的callback,或者如果你可以内联它并使用Promise库来使用返回。

希望这比上面的答案(现在有一个断开的链接)更有用。

另外请注意,string连接并不是收集string部分的有效方式,但是为了简单起见(也许您的代码不关心效率)

 var string = '' stream.on('readable',function(buffer){ var part = buffer.read().toString(); string += part; console.log('stream data ' + part); }); stream.on('end',function(){ console.log('final output ' + string); }); 

以上都没有为我工作。 我需要使用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)); }); 

我通常使用这个简单的函数将stream转换为string:

 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 }); 

从nodejs 文档你应该这样做 – 总是记住一个string,而不知道编码只是一堆字节:

 var readable = getReadableStreamSomehow(); readable.setEncoding('utf8'); readable.on('data', function(chunk) { assert.equal(typeof chunk, 'string'); console.log('got %d characters of string data', chunk.length); }) 

stream没有一个简单的.toString()函数(我知道),也不像.toStringAsync(cb)函数(我不明白)。

所以我创build了我自己的帮助函数:

 var streamToString = function(stream, callback) { var str = ''; stream.on('data', function(chunk) { str += chunk; }); stream.on('end', function() { callback(str); }); } // how to use: streamToString(myStream, function(myStr) { console.log(myStr); }); 

这工作对我来说,是基于节点v6.7.0文档 :

 let output = ''; stream.on('readable', function() { let read = stream.read(); if (read !== null) { // New stream data is available output += read.toString(); } else { // Stream is now finished when read is null. // You can callback here eg: callback(null, output); } }); stream.on('error', function(err) { callback(err, null); }) 

那么像stream式减速器呢?

这里是一个使用ES6类的例子。

 var stream = require('stream') class StreamReducer extends stream.Writable { constructor(chunkReducer, initialvalue, cb) { super(); this.reducer = chunkReducer; this.accumulator = initialvalue; this.cb = cb; } _write(chunk, enc, next) { this.accumulator = this.reducer(this.accumulator, chunk); next(); } end() { this.cb(null, this.accumulator) } } // just a test stream class EmitterStream extends stream.Readable { constructor(chunks) { super(); this.chunks = chunks; } _read() { this.chunks.forEach(function (chunk) { this.push(chunk); }.bind(this)); this.push(null); } } // just transform the strings into buffer as we would get from fs stream or http request stream (new EmitterStream( ["hello ", "world !"] .map(function(str) { return Buffer.from(str, 'utf8'); }) )).pipe(new StreamReducer( function (acc, v) { acc.push(v); return acc; }, [], function(err, chunks) { console.log(Buffer.concat(chunks).toString('utf8')); }) );