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

How do I defne a stream for passing between modules

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

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();

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

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

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

PDFKit 0.5 之前的写入和输出方法现已弃用

您参考此站点以获取更多信息……祝您好运…… http://pdfkit.org/docs/getting_started.html

操作方法如下:

创建一个 class 扩展 stream.PassTrough

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

创建此 class 的新实例并将其传递给文档和邮件附件

  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 请求,因此设置 headers 和状态。