Ааа!Это простой недосмотр.Вы пытаетесь закрыть браузер после отправки ответа.Поток выполнения останавливается после отправки ответа, и ваш await browser.close()
никогда не выполняется, в результате чего вы остаетесь с зомби.
Использование shell.js
кажется хакерским способом решения этой проблемы.
Вы могли быпросто поменяйте местами две строки res.send(bodyHTML)
и await browser.close()
.
Однако лучше использовать try..catch..finally
.Причина в том, что вы хотите, чтобы браузер закрывался, независимо от того, удачен ли поток или выдается ошибка.И, в отличие от другого фрагмента кода, вам не нужно пытаться закрыть браузер как в блоке catch
, так и в блоке finally
.Блок finally
всегда выполняется независимо от того, выдана ошибка или нет.
Итак, ваш код должен выглядеть следующим образом:
const puppeteer = require('puppeteer');
const express = require('express');
const router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
(async () => {
try {
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);
const bodyHTML = await page.evaluate(() => document.body.innerHTML);
res.send(bodyHTML);
} catch (e) {
console.log(e);
} finally {
await browser.close();
}
})();
});
Надеюсь, это поможет!