node.js - Heroku 上的 Puppeteer pdf 空白

标签 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。两个版本都存在该问题。 Node 版本为8.x.x

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

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

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

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

最佳答案

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

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

关于node.js - Heroku 上的 Puppeteer pdf 空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48542991/

相关文章:

clipboard - 如何从 headless puppeteer 操作测试中访问剪贴板的内容?

javascript - Puppeteer 和浏览器WSEndpoint : can't upload files dynamically

node.js - 在nodejs.org 上,linux tar 文件是否可以在 cygwin 上运行

node.js - 有没有办法将默认值设置为缺失/可选 JSON 属性?

angular - HTTP 心跳以避免长时间运行的 http 调用的连接断开

node.js - 无法在 Heroku 上部署 Hubot

ruby-on-rails - 云端重定向到原点而不是别名

javascript - 如何使用 Puppeteer 等待事件触发的页面重新加载?

javascript - 无法使用 mongodb update() 函数编辑文档

javascript - 如何在本地将多个目录下的多个js文件压缩为一个js