如何定义模块之间传递的流

时间:2016-07-11 15:43:09

标签: node.js nodemailer

我有一些代码旨在将pdf文件发送回网络浏览器。在该代码中,http服务器移交了一个响应流,我可以将我的pdf ooutput传送到。

const server = http.createServer((req, res) => {
 var doc = new PDFKit({size: 'A4', layout: 'landscape', info: info, margin: 30});
 doc.pipe(res);
 doc.text('Writing text to document');
 doc.end();
});

我现在想使用nodemailer将相同的pdf文档作为附件邮寄。所以我想我需要做这样的事情

  const Stream = require('stream').Readable; 
  const stream = new Stream();
  transport.sendMail({
  to: someone@somewhere,
  subject: 'Info You Wanted',
  text: 'The data you want is in pdf attachments',
  attachments: [{
    filename: 'dummy.pdf',
    content:stream
  }]
 });
 const doc = new PDFKit({size: 'A4', layout: 'landscape', info: info, margin: 30});
 doc.pipe(stream);
 doc.text('Writing text to document');
 doc.end();

这是我感到困惑的地方。以上是正确的吗?文档暗示我应该扩展一个Readable,但我不确定是什么

2 个答案:

答案 0 :(得分:0)

PDFDocument实例是可读的节点流。 他们没有自动保存在任何地方 ,但您可以调用管道方法将PDF文档的输出发送到另一个可写的节点流,因为它正在写入。完成文档后,请调用end方法以完成它。下面是一个示例,说明如何管道传输文件或HTTP响应。

doc.pipe fs.createWriteStream(' /path/to/file.pdf')#写入PDF                                                                      doc.pipe res #HTTP响应

现在不推荐在0.5版之前的PDFKit中找到的写入和输出方法

你引用这个网站获取更多信息......祝你好运...... http://pdfkit.org/docs/getting_started.html

答案 1 :(得分:0)

以下是您的操作方法:

创建一个扩展stream.PassTrough

的类
  const PassThrough = require('stream').PassThrough;
  class Tunnel extends PassThrough {
    constructor() {
      super();
    }
    setHeader() {
      //no op
    }
  }

创建此类的新实例并将其传递给doc和mail附件

  const tunnel = new Tunnel();
  transport.sendMail({
  to: someone@somewhere,
  subject: 'Info You Wanted',
  text: 'The data you want is in pdf attachments',
  attachments: [{
    filename: 'dummy.pdf',
    content:tunnel
  }]
 });
 const doc = new PDFKit({size: 'A4', layout: 'landscape', info: info, margin: 30});
 doc.pipe(tunnel);
 doc.text('Writing text to document');
 doc.end();

我不得不为普通的PassThrough流创建一个细微的变化,因为通过它的实际pdf处理软件回复了一个http请求,因此设置了标题和状态。