Тайм-аут в 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, моя проблема заключалась в том, что у меня был источник изображения, связанный с удаленным изображением на сервере, и это было причиной тайм-аута, я решил это, поместив изображение в маршрут сервера, и это было это, я надеюсь, это будет кому-то полезно

Другие вопросы по тегам