使用流来管道node.js中的数据

时间:2016-01-13 14:45:20

标签: node.js stream

设置:我正在从数据库中读取数据并将数据集通过电子邮件发送为CSV文件。数据以500行的块读取,我使用ya-csv将记录作为CSV写入流。然后,我想使用mailgun-js将该文件作为附件发送电子邮件。

选项1(我不想做的事):

  1. 创建临时文件;
  2. 为该文件创建写入流;
  3. 写下所有CSV记录;
  4. 将所有内容读回内存以附加到电子邮件中;
  5. 选项2(我想做但却不知道如何):

    1. 创建可写流;
    2. 创建可读的流;
    3. 以某种方式将写入从(1)传递到(2);
    4. 将可写流传递给ya-csv;
    5. 将可读流传递给mailgun;
    6. 获取数据并写入写入流,直到没有更多数据;
    7. 结束写入流,从而结束读取流并发送电子邮件。
    8. 我一直在阅读https://github.com/substack/stream-handbookhttps://nodejs.org/api/stream.html,问题是我无法使用writable.pipe(readable);

      我尝试使用Duplex流(即写入和读取流都只是双工流),但这不起作用,因为Duplex是一个抽象类,我必须实现几个链接部分。

      问题:如何使用流将CSV记录的这种写入链接到流式传输邮件枪的附件?

1 个答案:

答案 0 :(得分:0)

不要过度思考它,mailgun-js可以将流作为附件,它可以像以下一样简单:

var csv = require('csv');
var mailgun = require('mailgun-js');

// this will stream some csv
var file = myDbStream.pipe(csv.stringify());

var data = {
    from: 'Excited User <me@samples.mailgun.org>',
    to: 'serobnic@mail.ru',
    subject: 'Hello',
    text: 'Testing some Mailgun awesomness!',
    attachment: file // attach it to your message, mailgun should deal with it
};

mailgun.messages().send(data, function (error, body) {
    console.log(body);
});

我不知道您的Db是什么,也许驱动程序已经支持流,或者您必须手动提供csv(可以使用{{1}轻松完成})。

修改

event-stream似乎无法轻易录音,ya-csv效果更好。