我正在破解一个smtp-protocol
用于捕获 SMTP 电子邮件并处理邮件数据的 Node 程序。该库以流的形式提供邮件数据,我不知道如何将其转换为字符串。
我目前正在使用 将其写入标准输出stream.pipe(process.stdout, { end: false })
,但正如我所说,我需要字符串中的流数据,一旦流结束,我就可以使用它。
如何将 Node.js 流中的所有数据收集到一个字符串中?
我正在破解一个smtp-protocol
用于捕获 SMTP 电子邮件并处理邮件数据的 Node 程序。该库以流的形式提供邮件数据,我不知道如何将其转换为字符串。
我目前正在使用 将其写入标准输出stream.pipe(process.stdout, { end: false })
,但正如我所说,我需要字符串中的流数据,一旦流结束,我就可以使用它。
如何将 Node.js 流中的所有数据收集到一个字符串中?
另一种方法是将流转换为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)
以上都不适合我。我需要使用 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));
});
希望这比上面的答案更有用:
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 文本产生不可预知的失败(它假定每个字符都适合一个字节),但也许您也不关心这一点。
(这个答案是多年前的,当时它是最好的答案。现在下面有一个更好的答案。我没有跟上 node.js,我无法删除这个答案,因为它被标记为“在这个问题上是正确的” ”。如果你想向下点击,你想让我做什么?)
关键是使用Readable Stream的data
和end
事件。收听这些事件:
stream.on('data', (chunk) => { ... });
stream.on('end', () => { ... });
当您收到data
事件时,将新的数据块添加到为收集数据而创建的缓冲区中。
收到end
事件后,如有必要,将完成的 Buffer 转换为字符串。然后做你需要做的事情。
你怎么看待这件事 ?
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");
}