在Heroku上的Puppeteer pdf空白

时间:2018-01-31 13:08:45

标签: node.js heroku puppeteer

我在我的网络应用程序中制作一条路线,将某些HTML转换为pdf。这在开发中很有用,但在Heroku上失败了。其他Puppeteer任务在heroku上工作正常。 HTML我的渲染非常小。

  const generatePDF = asyncMiddleware(async (req, res) => {
    const browser = await puppeteer.launch({
      dumpio: true,
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    const page = await browser.newPage();
    page.on('error', err => {
      console.error('err', err, err.stack)
      browser.close();
    });
    await page.goto(`data:text/html,${req.body.html}`, {
      waitUntil: 'networkidle2',
    });

    // stupid attempt at debugging, making sure page has time to render?
    await page.waitFor(6000);
    const pdf = await page.pdf();
    res.set('content-type', 'application/pdf');
    await browser.close();
    res.send(pdf);
  });

  module.exports = require('express')
    .Router()
    .post('/', generatePDF)

当我在Heroku上路线时,我得到一张空白的PDF。 Puppeteer生成以下标准输出

[0131/123556.374089:ERROR:gpu_process_transport_factory.cc(1043)] Lost UI shared context.

当我编写这段代码时,我的版本是0.10.x,但我认为升级可能有所帮助,所以我上升到1.0.0。这两个版本都存在问题。节点版本为8.x.x

我认为它可能是服务器内存问题,所以我升级到2x dyno,但这没有帮助。

我认为这可能与这两个问题之一有关: - https://github.com/GoogleChrome/puppeteer/issues/1875 - https://github.com/GoogleChrome/puppeteer/issues/1925

但是,这些似乎与Heroku无关,或解释它是如何在一个环境中工作而不是另一个环境

更新:当我查看有效负载时,pdf的数据看起来像UUID!

1 个答案:

答案 0 :(得分:2)

我明白了!我的服务器的客户端是axios。我需要告诉axios我正在提供二进制文件。

  const { data: pdf } = await req({
    method: 'post',
    url: 'api/pdfs',
    responseType: 'arraybuffer', // <-- this was missing
    data: { html }
  });