我正在入侵一个Node程序,该程序使用SMTP协议捕获SMTP电子邮件并对邮件数据采取行动。库将邮件数据作为流提供,但我不知道如何将其转换为字符串。

我目前正在用stream.pipe(process. pipe)将其写入标准输出。stdout, {end: false}),但正如我所说的,我需要一个字符串中的流数据,一旦流结束,我就可以使用它。

我如何收集所有的数据从一个Node.js流到一个字符串?


当前回答

setEncoding('utf8');

塞巴斯蒂安做得好。

我有“缓冲区问题”的几行测试代码,并添加编码信息,它解决了它,见下文。

说明问题

软件

// process.stdin.setEncoding('utf8');
process.stdin.on('data', (data) => {
    console.log(typeof(data), data);
});

输入

hello world

输出

object <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 0d 0a>

演示解决方案

软件

process.stdin.setEncoding('utf8'); // <- Activate!
process.stdin.on('data', (data) => {
    console.log(typeof(data), data);
});

输入

hello world

输出

string hello world

其他回答

在我的例子中,响应头的内容类型是content - type: text/plain。所以,我已经从Buffer读取了数据:

let data = [];
stream.on('data', (chunk) => {
 console.log(Buffer.from(chunk).toString())
 data.push(Buffer.from(chunk).toString())
});

简单易用的流行(每周超过500万次下载)和轻量级的get-stream库:

https://www.npmjs.com/package/get-stream

const fs = require('fs');
const getStream = require('get-stream');

(async () => {
    const stream = fs.createReadStream('unicorn.txt');
    console.log(await getStream(stream)); //output is string
})();

setEncoding('utf8');

塞巴斯蒂安做得好。

我有“缓冲区问题”的几行测试代码,并添加编码信息,它解决了它,见下文。

说明问题

软件

// process.stdin.setEncoding('utf8');
process.stdin.on('data', (data) => {
    console.log(typeof(data), data);
});

输入

hello world

输出

object <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 0d 0a>

演示解决方案

软件

process.stdin.setEncoding('utf8'); // <- Activate!
process.stdin.on('data', (data) => {
    console.log(typeof(data), data);
});

输入

hello world

输出

string hello world

(这个答案是多年前的,当时它是最好的答案。下面有一个更好的答案。我没有跟上node.js,我不能删除这个答案,因为它被标记为“正确的这个问题”。如果你想按下,你想让我做什么?)

关键是使用可读流的数据和结束事件。听下面这些事件:

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

当您收到数据事件时,将新的数据块添加到为收集数据而创建的Buffer中。

当您接收到结束事件时,如果需要,将完成的Buffer转换为字符串。那就做你该做的事。

这对我来说是有效的,并且基于Node 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 e.g.:
        callback(null, output);
    }
});

stream.on('error', function(err) {
  callback(err, null);
})