![](/img/trans.png)
[英]Reading Google Sheets from Firebase cloud functions using javascript promises
[英]Using promises with PDFMake on Firebase Cloud Functions
我使用PDFMake(的变体PDFKit
)生成的使用实时数据库触发器火力地堡云功能的PDF文件。 该函数从数据库获取所有相关数据,然后将其传递给应该生成PDF的函数。
所有这些都是使用Promises完成的。 一切正常,直到实际生成PDF。
这是我的主要事件监听器中的代码:
exports.handler = (admin, event, storage) => {
const quotationData = event.data.val();
// We must return a Promise when performing async tasks inside Functions
// Eg: Writing to realtime db
const companyId = event.params.companyId;
settings.getCompanyProfile(admin, companyId)
.then((profile) => {
return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage);
})
.then(() => {
console.log('Generation Successful. Pass for email');
})
.catch((err) => {
console.log(`Error: ${err}`);
});
};
要生成PDF,这是我的代码:
exports.generatePDF = (fonts, companyInfo, quotationData, storage) => {
const printer = new PdfPrinter(fonts);
const docDefinition = {
content: [
{
text: [
{
text: `${companyInfo.title}\n`,
style: 'companyHeader',
},
`${companyInfo.addr_line1}, ${companyInfo.addr_line2}\n`,
`${companyInfo.city} (${companyInfo.state}) - INDIA\n`,
`Email: ${companyInfo.email} • Web: ${companyInfo.website}\n`,
`Phone: ${companyInfo.phone}\n`,
`GSTIN: ${companyInfo.gst_registration_number} • PAN: AARFK6552G\n`,
],
style: 'body',
//absolutePosition: {x: 20, y: 45}
},
],
styles: {
companyHeader: {
fontSize: 18,
bold: true,
},
body: {
fontSize: 10,
},
},
pageMargins: 20,
};
return new Promise((resolve, reject) => {
// const bucket = storage.bucket(`${PROJECT_ID}.appspot.com`);
// const filename = `${Date.now()}-quotation.pdf`;
// const file = bucket.file(filename);
// const stream = file.createWriteStream({ resumable: false });
const pdfDoc = printer.createPdfKitDocument(docDefinition);
// pdfDoc.pipe(stream);
const chunks = [];
let result = null;
pdfDoc.on('data', (chunk) => {
chunks.push(chunk);
});
pdfDoc.on('error', (err) => {
reject(err);
});
pdfDoc.on('end', () => {
result = Buffer.concat(chunks);
resolve(result);
});
pdfDoc.end();
});
};
这里可能出现的问题是阻止承诺,从而使报价代码按预期执行?
在firebase日志中,我看到的是Function execution took 3288 ms, finished with status: 'ok'
根据执行时间和缺少错误,看起来您正在为PDF成功创建缓冲区,但实际上并没有从函数中返回它。
.then((profile) => {
return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage);
})
.then(() => {
console.log('Generation Successful. Pass for email');
})
在上面的代码,你传递结果到下一次then
块,但随后恢复从该块不确定的。 这个Promise链的最终结果将是未定义的。 要通过结果,您需要在Promise链的末尾返回它:
.then((profile) => {
return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage);
})
.then(buffer => {
console.log('Generation Successful. Pass for email');
return buffer;
})
我正在尝试使用firebase云功能生成pdf,但我被阻止了关于定义fonts参数。 这是我的定义:
var fonts = {
Roboto: {
normal: './fonts/Roboto-Regular.ttf',
bold: './fonts/Roboto-Bold.ttf',
italics: './fonts/Roboto-Italic.ttf',
bolditalics: './fonts/Roboto-BoldItalic.ttf'
}
};
我创建了一个包含上述文件的字体文件夹。 但是无论我在哪里设置fonts文件夹(在root,在functions文件夹或node_modules文件夹中),我在部署函数时都会收到错误'no such file or directory'。 任何建议将非常感谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.