我在 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/