我正在入侵一个Node程序,该程序使用SMTP协议捕获SMTP电子邮件并对邮件数据采取行动。库将邮件数据作为流提供,但我不知道如何将其转换为字符串。
我目前正在用stream.pipe(process. pipe)将其写入标准输出。stdout, {end: false}),但正如我所说的,我需要一个字符串中的流数据,一旦流结束,我就可以使用它。
我如何收集所有的数据从一个Node.js流到一个字符串?
我正在入侵一个Node程序,该程序使用SMTP协议捕获SMTP电子邮件并对邮件数据采取行动。库将邮件数据作为流提供,但我不知道如何将其转换为字符串。
我目前正在用stream.pipe(process. pipe)将其写入标准输出。stdout, {end: false}),但正如我所说的,我需要一个字符串中的流数据,一旦流结束,我就可以使用它。
我如何收集所有的数据从一个Node.js流到一个字符串?
当前回答
还有一个是使用承诺的字符串:
function getStream(stream) {
return new Promise(resolve => {
const chunks = [];
# Buffer.from is required if chunk is a String, see comments
stream.on("data", chunk => chunks.push(Buffer.from(chunk)));
stream.on("end", () => resolve(Buffer.concat(chunks).toString()));
});
}
用法:
const stream = fs.createReadStream(__filename);
getStream(stream).then(r=>console.log(r));
如果需要,删除. tostring()以用于二进制数据。
更新:@AndreiLED正确地指出了字符串的问题。我不能得到一个流返回字符串与节点的版本,但api指出这是可能的。
其他回答
我更幸运的是这样使用:
let string = '';
readstream
.on('data', (buf) => string += buf.toString())
.on('end', () => console.log(string));
我使用节点v9.11.1, readstream是来自http的响应。回调。
另一种方法是将流转换为promise(参考下面的示例),然后使用then(或await)将解析值分配给变量。
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)
还有一个是使用承诺的字符串:
function getStream(stream) {
return new Promise(resolve => {
const chunks = [];
# Buffer.from is required if chunk is a String, see comments
stream.on("data", chunk => chunks.push(Buffer.from(chunk)));
stream.on("end", () => resolve(Buffer.concat(chunks).toString()));
});
}
用法:
const stream = fs.createReadStream(__filename);
getStream(stream).then(r=>console.log(r));
如果需要,删除. tostring()以用于二进制数据。
更新:@AndreiLED正确地指出了字符串的问题。我不能得到一个流返回字符串与节点的版本,但api指出这是可能的。
(这个答案是多年前的,当时它是最好的答案。下面有一个更好的答案。我没有跟上node.js,我不能删除这个答案,因为它被标记为“正确的这个问题”。如果你想按下,你想让我做什么?)
关键是使用可读流的数据和结束事件。听下面这些事件:
stream.on('data', (chunk) => { ... });
stream.on('end', () => { ... });
当您收到数据事件时,将新的数据块添加到为收集数据而创建的Buffer中。
当您接收到结束事件时,如果需要,将完成的Buffer转换为字符串。那就做你该做的事。
使用非常流行的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()));