首页 > 解决方案 > Firebase 函数 (Google Cloud) 上的 Puppeteer PDF 创建超时

问题描述

我在 Firebase 上有一个功能可以创建一个每次都会超时的 PDF 文件。为了调查这个问题,我添加了带有数字的调试日志。我运行的函数的源代码是:

const createPDF = async (html, outputPath) => {

    console.log(1);
    let pdf;

    try {
        console.log(2);

        const browser = await puppeteer.launch();
        console.log(3);

        const page = await browser.newPage();
        console.log(4);

        await page.emulateMediaType('screen');

        console.log(5);
        await page.setContent(html, {
            waitUntil: 'networkidle0'
        });

        console.log(6);
        pdf = await page.pdf({
           // path: outputPath,
            format: 'A4',
            printBackground: true,
            margin: {
                top: "50px",
                bottom: "50px"
            }
        });

        console.log(7);
        await browser.close();

    } catch (e) {
        console.error(e);
    }

    console.log(8);
    return pdf;
};

日志说:

10:58:12.490 AM 1
10:58:12.492 AM 2
10:58:16.469 AM 3
10:58:31.236 AM Function execution took 20003 ms, finished with status: 'timeout' 

该脚本有效,当我在本地部署它时。我做错了什么?

标签: firebasegoogle-cloud-functionstimeoutpdf-generationpuppeteer

解决方案


我认为launch应该与 argument 一起使用{ args: ['--no-sandbox'] }。我在这里找到了这种方法的例子。

我创建了结合提供的代码和 helloworld 云函数的测试,实际上总是以超时结束3。但是,当我使用上述参数时,它开始正常工作。我用 256MiB 和 30 秒超时对其进行了测试。

工作代码:

const puppeteer = require('puppeteer');
 
exports.helloWorld = async (req, res) => {
  console.log(2);

  const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
  console.log(3);

  const page = await browser.newPage();
  console.log(4);
  
  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(message);
};

推荐阅读