Puppeteer 在部署时出现 503 错误,但不是在本地

Puppeteer gets 503 error when deployed but not locally

我在 Node 中使用 puppeteer 截取域的屏幕截图,但遇到一些不一致的问题。

当我在本地 运行 代码时一切正常,但是当我将它部署在 Heroku 上时,我将在测试时得到 503(服务不可用)8/10 次。不确定为什么它会工作 2/10 次。

我在 Heroku 中确实有插件,我已经尝试重置它们以确保它们像某些解决方案提到的那样以正确的顺序上传。我也试过更改 puppeteer 函数中的设置,就像这里显示的那样,并且有 'headless:true"

我将图像作为 base64 字符串发送,然后显示在前端。

这是我的功能代码,api 路由和前端请求:

功能代码:

async function captureScreenshot(domain) {

  try {

    const browser = await puppeteer.launch({
      args: [
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--disable-dev-shm-usage",
      ],
    });

    const page = await browser.newPage();
    await page.setViewport({ width: 1440, height: 1080 });
    await page.goto(`http://${domain}`);
    let domainScreenshot = await page.screenshot({
      type: "jpeg",
      quality: 75,
    });
    domainScreenshot = Buffer.from(domainScreenshot).toString("base64");

    await browser.close();
    return domainScreenshot;
  } catch (err) {
    console.log(`❌ Error: ${err.message}`);
  }
}

API路线:

router.get("/screenshot", async (req, res, next) => {
  try {
    const { domain } = req.query;
    const buffer = await captureScreenshot(domain);
    res.setHeader("Content-Type", "image/png");
    res.send(buffer);
  } catch (error) {
    next(error);
  }
});

Redux 请求:

export const fetchScreenshot = (domain) => async (dispatch) => {
  try {
    const params = {
      domain,
    };
    const { data: imgUrl } = await axios.get("/api/domainData/screenshot", {
      params,
    });
    if (imgUrl) {
      dispatch(setImgURL(domain, imgUrl));
    }
  } catch (error) {
    console.error(error);
  }
};

找到解决方案:

我将这一行添加到 puppeteer args 数组中:

"--single-process"

还是有误差,不过差不多是1/10倍,可以接受的多了。