如何定义在模块之间传递的流
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 和状态。
我有一些代码旨在将 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 和状态。