Node.JS Puppeter:MaxListenerSexceedawarning:检测到可能的EventEmitter内存泄漏。(Heroku部署)
我有一个非常简单的测试应用程序,在本地运行(几乎)没有错误,但是在我的Heroku部署中,事情并没有那么顺利。以下是该应用程序的基础知识 木偶演员选项:Node.JS Puppeter:MaxListenerSexceedawarning:检测到可能的EventEmitter内存泄漏。(Heroku部署),node.js,heroku,puppeteer,Node.js,Heroku,Puppeteer,我有一个非常简单的测试应用程序,在本地运行(几乎)没有错误,但是在我的Heroku部署中,事情并没有那么顺利。以下是该应用程序的基础知识 木偶演员选项: const puppetOptions = { defaultViewport: null, args: [ "--incognito", "--no-sandbox", "--single-process",
const puppetOptions = {
defaultViewport: null,
args: [
"--incognito",
"--no-sandbox",
"--single-process",
"--no-zygote"
],
}
网站抓取功能:
module.exports.checkWebsite = async (url, int) => {
console.log(`Scraping site...`);
// launch a browser
const browser = await puppeteer.launch(constants.puppetOptions);
try {
// open a new page
const page = await browser.newPage();
// navigate to URL
await page.goto(url);
// Find a specific element on the page
const element = await page.$('element.class');
// If the element exists, log success, and clear the setInterval function
// If not, log it and let the periodic scrape continue
if (element) {
console.log(`Element Available...`);
clearInterval(int)
} else {
console.log(`Element Not Available...`);
}
} catch (err) {
console.log(`Website Scrape Error!`, err);
} finally {
// Regardless of the outcome, shutdown the browser
console.log('Closing browser...');
await browser.close();
return;
}
}
然后是运行这些东西的基本服务器:
let checkWebsiteRun;
let checkWebsite2Run;
const server = app.listen(process.env.PORT || 5000, () => {
console.log('Running server...');
checkWebsiteRun = setInterval(() => {
checkWebsite("https://google.com", checkWebsiteRun);
}, 1000 * 60);
checkWebsite2Run = setInterval(() => {
checkWebsite("https://yahoo.com", checkWebsite2Run);
}, 1000 * 60);
})
现在在现实中,我一直试图让这些间隔擦伤中的四个同时发生在不同的站点上。似乎我添加的越多,就越有可能出现以下MaxListenerSexceedAwarning:可能的EventEmitter
错误弹出窗口。此外,我更有可能得到TimeoutError:在我的刮伤的看似随机的实例上,导航超时30000ms超过了错误。更让人困惑的是,该应用程序似乎在最初几次尝试中表现最差,出现超时错误和最大侦听器错误,但在失败一段时间后,该应用程序似乎趋于平稳运行
我想我的主要问题是,在我的应用程序中是否有一些我没有执行的清理,或者在糟糕的实践中是否有一些我执行的效率低下的问题?也许打开了太多无头浏览器?也许关闭并重新打开浏览器而不是刷新页面?可能每个站点都有单独的浏览器吗?您启动新浏览器的速度比关闭旧浏览器的速度快。我建议不要使用setInterval来处理类似的事情。@pguardiario谢谢,你有其他方法的建议吗?关闭浏览器似乎在每个新间隔之前运行。那么,是不是我对每个单独的scrape使用不同的浏览器?如果你在循环中等待函数,你就会知道它总是在执行另一个函数之前完成。@pguardiario我想我没有想到这一点。我打算在设定的时间间隔内运行它,但我也可以在自然的for循环中运行它。我使用for循环已经很长时间了,我甚至没有想到它是一个选项。我明天会试一试,看看它是否能消除错误。谢谢你,伙计。