javascript - Puppeteer 不关闭浏览器

标签 javascript express async-await puppeteer

我在 express/node/ubuntu 上运行 puppeteer,如下所示:

var puppeteer = require('puppeteer');
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
    (async () => {
        headless = true;
        const browser = await puppeteer.launch({headless: true, args:['--no-sandbox']});
        const page = await browser.newPage();
        url = req.query.url;
        await page.goto(url);
        let bodyHTML = await page.evaluate(() => document.body.innerHTML);
        res.send(bodyHTML)
        await browser.close();
    })();
});

多次运行此脚本会留下数百个僵尸:
$ pgrep chrome | wc -l
133

这会阻塞 srv,

我该如何解决?

运行kill从 Express JS 脚本可以解决吗?

除了 puppeteer 和 headless chrome 之外,还有更好的方法来获得相同的结果吗?

最佳答案

啊!这是一个简单的疏忽。如果发生错误并且您的 await browser.close()永远不会执行因此给你留下僵尸。
使用 shell.js似乎是解决此问题的一种hacky方式。
更好的做法是使用 try..catch..finally .原因是您希望浏览器关闭,而不管流程是否愉快或抛出错误。
与其他代码片段不同,您不必尝试在 catch 中关闭浏览器。 block 和 finally堵塞。 finally无论是否抛出错误, block 总是被执行。
所以,你的代码应该是这样的,

const puppeteer = require('puppeteer');
const express = require('express');

const router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  (async () => {
    const browser = await puppeteer.launch({
      headless: true,
      args: ['--no-sandbox'],
    });

    try {
      const page = await browser.newPage();
      url = req.query.url;
      await page.goto(url);
      const bodyHTML = await page.evaluate(() => document.body.innerHTML);
      res.send(bodyHTML);
    } catch (e) {
      console.log(e);
    } finally {
      await browser.close();
    }
  })();
});

希望这可以帮助!

关于javascript - Puppeteer 不关闭浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53939503/

相关文章:

javascript - 快速 session : Property 'signin' does not exist on type 'Session & Partial<SessionData>' . (2339)

async-await - 将 next.js 配置为使用 Babel 不转换异步函数

javascript - node-js 中的异步/等待获取

javascript - 表达错误处理模式

c# - 构造函数 Controller 中的 MVC 异步方法

javascript - react : Send ref back to container component?

javascript - 二维数组及其矩阵表示约定

javascript - 在表单提交时有条件地显示引导模式

javascript - 我不能使用 Angularjs 在我的 index.html 中包含另一个 html 页面

javascript - 如何在io.sockets.on回调中使用io对象?