Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.JS Puppeter:MaxListenerSexceedawarning:检测到可能的EventEmitter内存泄漏。(Heroku部署)_Node.js_Heroku_Puppeteer - Fatal编程技术网

Node.JS Puppeter:MaxListenerSexceedawarning:检测到可能的EventEmitter内存泄漏。(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",

我有一个非常简单的测试应用程序,在本地运行(几乎)没有错误,但是在我的Heroku部署中,事情并没有那么顺利。以下是该应用程序的基础知识

木偶演员选项:

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循环已经很长时间了,我甚至没有想到它是一个选项。我明天会试一试,看看它是否能消除错误。谢谢你,伙计。