【问题标题】:Using streams to pipe data in node.js在 node.js 中使用流来管道数据
【发布时间】:2016-04-18 14:20:35
【问题描述】:

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

选项1(我不想做的):

  1. 创建临时文件;
  2. 为该文件创建写入流;
  3. 写入所有 CSV 记录;
  4. 将所有内容读回内存以附加到电子邮件中;

 选项 2(我想做但不太知道如何做):

  1. 创建可写流;
  2. 创建可读流;
  3. 以某种方式将写入从 (1) 传输到 (2);
  4. 将可写流传递给 ya-csv;
  5. 将可读流传递给 mailgun;
  6. 获取数据并写入写入流,直到没有更多数据为止;
  7. 结束写入流,从而结束读取流并发送电子邮件。

我一直在阅读https://github.com/substack/stream-handbookhttps://nodejs.org/api/stream.html,问题是我无法使用writable.pipe(readable);

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

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

【问题讨论】:

    标签: node.js stream


    【解决方案1】:

    别想太多,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(可以通过 event-stream 轻松完成)。

    编辑

    ya-csv 似乎无法轻松通过管道传输,csv 效果更好。

    【讨论】:

    • 这似乎可行,除了我使用mailgun.Attachment 创建附件,并且我收到的电子邮件中没有任何附件。我已经从 data 流中记录了事件,并且数据绝对正确,但是电子邮件是通过没有附件发送的。
    • 从文档中,他们需要 contentTypeknownLength 用于流,并且 如果附件对象不满足这些有效条件,则会被忽略。
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多