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