超出了内存配额-Heroku + Puppeteer

时间:2019-12-12 16:35:13

标签: node.js heroku puppeteer

我对Heroku和节点服务器非常陌生,所以这可能是一个非常基本的问题。

我无法使用puppeteer module访问路线,但可以访问仅呈现视图的默认主页。

我使用了heroku logs -a node-stuff,从一开始我就看到以下错误:

Process running mem=726M(138.9%)
Error R14 (Memory quota exceeded)
Error: Failed to launch chrome!

到目前为止,我发现的唯一解决方案是每次heroku restart -a node-stuff

重启服务器

这是怎么回事?

  • 我该如何解决?
  • 如何释放内存?

我的主要路线很基本:

var express = require('express');
var puppeteer = require('puppeteer');
var cors = require('cors')

var router = express.Router();

/* GET home page. */
router.get('/', cors(), function(req, res, next) 
    var scrapePage = async (req, Admin) => {
        const browser = await puppeteer.launch({
            args: [
                '--no-sandbox',
                '--disable-setuid-sandbox',
            ]
        });
        const page = await browser.newPage();
        await page.goto(req.query.url);

        //loading a .js file to use it those functions on page load
        await page.addScriptTag({path: "./models/admin.js"});

        const scrapedData = await page.evaluate(function(){

            //query stuff from window and document variables

            return {
                whatever: here
            };
        });

        await browser.close();
        return scrapedData;    
    };

    const test = new Promise((resolve, reject) => {
        scrapePage(req, Admin)
        .then(data => {
            res.json(data);
        })
        .catch(function(err){
            console.log(err);
            res.send(err);
        });
    });
});
module.exports = router;

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题,解决方案最终是由于抓取中偶尔出现错误,所以我并不总是运行browser.close()。确保始终关闭浏览器,将scrapePage代码包装在try catch finally中,并将browser.close()放在finally块中,以便无论抓取结果如何都可以运行