Тайм-аут в Pdf-html при работе в Google Cloud Function
Мы создали облачную функцию, которая генерирует PDF-файл. Библиотека, которую мы используем,
https://www.npmjs.com/package/html-pdf
Проблема в том, что мы пытаемся выполнить
.create()
метод время ожидания со следующими ошибками
"Error: html-pdf: PDF generation timeout. Phantom.js script did not exit.
at Timeout.execTimeout (/srv/node_modules/html-pdf/lib/pdf.js:91:19)
at ontimeout (timers.js:498:11)
Это нормально работает на localhost, но происходит, когда мы развертываем функцию на GCP.
Некоторые решения, которые мы уже пробовали:
Решение № 1 Да, мы обновили настройки тайм-аута до
const options = {
format: "A3",
orientation: "portrait",
timeout: "100000"
// zoomFactor: "0.5"
// orientation: "portrait"
};
и это все еще не работает.
вот последний фрагмент, который запускает функцию PDF
const options = {
format: "A3",
orientation: "portrait",
timeout: "100000"
// zoomFactor: "0.5"
// orientation: "portrait"
};
try {
// let pdfRes = await new Promise(async (resolve, reject) => {
console.log("Before pdf.create()")
let pdfResponse = await pdf.create(html, options).toFile(localPDFFile, async function (err, res) {
if (err) {
console.log(err)
}
console.log('response of pdf.create(): ', res);
let uploadBucket = await bucket.upload(localPDFFile, {
metadata: { contentType: "application/octet-stream" }
});
let docRef = await db
.collection("Organizations")
.doc(context.params.orgId)
.collection("regulations")
.doc(context.params.regulationId)
.collection("reports")
.doc(context.params.reportId);
await docRef.update({
pdf: {
status: "created",
reportName: pdfName
}
});
});
} catch (error) {
console.log('error: ', error);
}
``
3 ответа
Используя обещание, мы можем исправить эту ошибку тайм-аута
var Handlebars = require('handlebars');
var pdf = require('html-pdf');
var options = {
height: "10.5in", // allowed units: mm, cm, in, px
width: "8in" // allowed units: mm, cm, in, px
"timeout": 600000
};
var document = {
html: html1,
path: resolvedPath + "/" + filename,
data: {}
};
var create = function(document, options) {
return new Promise((resolve, reject) => {
// Compiles a template
var html = Handlebars.compile(document.html)(document.data);
var pdfPromise = pdf.create(html, options);
// Create PDF from html template generated by handlebars
// Output will be PDF file
pdfPromise.toFile(document.path, (err, res) => {
if (!err)
resolve(res);
else
reject(err);
});
});
}
Я видел много подобных случаев, даже в моем текущем проекте, где мы используем пошаговые функции (когда облачным функциям требуется больше вычислительной мощности, мы делим их на части, то есть мини-облачные функции). Но я думаю, что пошаговые функции не будут работать в вашем случае, потому что вы используете один модуль. В вашем случае вы должны использовать вычислительный движок для выполнения этой операции.
Кажется, это проблема с html, моя проблема заключалась в том, что у меня был источник изображения, связанный с удаленным изображением на сервере, и это было причиной тайм-аута, я решил это, поместив изображение в маршрут сервера, и это было это, я надеюсь, это будет кому-то полезно