【发布时间】:2019-03-01 13:07:35
【问题描述】:
我有一个 node.js /(基于 express)loopback.js 应用程序,带有一个使用 HtmlToPDF 生成 PDF 的 PDF 服务。
一些代码:
services/pdf.js
exports.PDF = function(options, cb) {
// ...
var htmlToPDF = new HTMLToPDF({
// ... options
});
function sendBackFile(outputPath, cb) {
fs.readFile(outputPath, function (err, data) {
if (err) {cb(err)}
var contentDisposition = 'attachment; filename=' + filename + '.pdf';
cb(null, data, 'application/pdf', contentDisposition, 'SAMEORIGIN');
})
}
// start / stop Xvfb code ...
htmlToPDF.build(function (err) {
if (err) {cb(err)};
// read the file and send it back
sendBackFile(outputPath, cb)
});
}
对于不同类型的 PDF,我有不同的模板。 (对于每个类型的不同名称、输出路径、模板等)
exports.invetory = function(html, cb) {
exports.PDF({
html: html
}, cb);
}
这里是一个例子,我如何使用代码中的服务。
models/inventory.js
Inventory.pdf = (id, next) => {
pdf.inventory('yo', next);
}
分解
- PDF服务导入代码,调用库存模板
- 库存模板调用 PDF 服务
- PDF 服务启动一个 htmlToPDF 实例,一个 PDF 被创建并保存为一个文件。
- 从磁盘读取文件,然后 API 将其发回。
问题
我尝试让我的Inventory.pdf 函数具有异步/等待意识。但是如果我这样做了
Inventory.pdf = async (id, next) => {
return await pdf.inventory('yo', next);
}
接下来,(回调函数)将是undefined,这没关系,但是我应该如何更改 PDF 服务,以使其与异步调用和旧回调方式一起工作。 (我在代码中有很多旧模板函数)。任何建议都非常受欢迎。
【问题讨论】:
-
您需要在
if (err) {cb(err)}中有一个return:if (err) {return cb(err)}没有它,其余的回调将运行。而cb将被调用两次。
标签: node.js async-await loopbackjs html-to-pdf