我目前正在开发项目,我需要构建一个需要在浏览器中打开URL的应用程序,以便在其上使用某些功能。
因为我在nodejs脚本中使用了puppeteer来打开服务器端的浏览器所以我可以像api一样使用它。
这里是代码(nodejs):
app.get('/do', (req, res) => {
console.log("ok");
(async() => {
var browser = await puppeteer.launch(
{ args: ['--no-sandbox','--disable-setuid-sandbox'], headless: false });
var page = await browser.newPage();
await page.goto('https://url.com');//i hid the url for personal reason
await page.waitFor(1000); // to wait for 1000ms
await page.waitFor('body div'); // to wait for the 'body div' selector in body
await page.waitFor(() => Math.random() < 0.5); // to wait for the predicate
await page.screenshot({
path: 'public/photo.png'
});
await browser.close();
await res.end('<html><head></title></head><body><h1><img src=photo.png ></img></h1></body></html>');
})();
});
此代码在本地运行,但是当我在heroku上部署时,它会向我显示此错误:
app [web.1]:/ send
app [web.1] :(节点:4) UnhandledPromiseRejectionWarning:未处理的承诺拒绝 (拒绝ID:1):错误:无法启动chrome!
应用[web.1]: /app/node_modules/puppeteer/.local-chromium/linux-515411/chrome-linux/nacl_helper: 加载共享库时出错:libnss3.so:无法打开共享库 目标文件:没有这样的文件或目录
应用[web.1]: [21:21:1228 / 131735.202176:错误:nacl_fork_delegate_linux.cc(316)]不好 NaCl辅助启动ack(0字节)
应用[web.1]:
应用[web.1]:
app [web.1]:疑难解答: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md
应用[web.1]:
app [web.1] :(节点:4)[DEP0018] 弃用警告:已弃用未处理的承诺拒绝。在 未来,未经处理的承诺拒绝将终止 Node.js使用非零退出代码进行处理。
但是,如果我删除headless: false
它可以工作,但问题是该网址显示了一个变暖页面,我需要使用浏览器,如chrome或mozilla或safari。
如何解决此问题?
答案 0 :(得分:4)
您需要将Puppeteer Heroku buildpack包含在应用程序的buildpack列表中。转到Heroku dashboard并打开您的应用。转到设置&gt; Buildpacks&gt;添加buildpack并使用此URL。
https://github.com/jontewks/puppeteer-heroku-buildpack
单击“添加buildpack”时,只需将该URL粘贴到输入中,然后单击“保存”。在下一次部署时,您的应用程序还将安装Puppeteer需要运行的依赖项。
请参阅troubleshooting guide以获取更多帮助。
答案 1 :(得分:0)
这对我有用。首先,我清除所有构建包,然后添加puppeteer-heroku-buildpack和heroku / nodejs一个:
$ heroku buildpacks:clear
$ heroku buildpacks:add --index 1 https://github.com/jontewks/puppeteer-heroku-buildpack
$ heroku buildpacks:add --index 1 heroku/nodejs