javascript - firebase 函数中的 Puppeteer 无法启动 chrome
问题描述
我尝试在 firebase 函数中运行 puppeteer。据我了解这个 https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-puppeteer-on-google-cloud-functions 它应该可以添加
"engines": {
"node": "8"
},
在 package.json 中。我得到了积极的反馈,它使用 firebase deploy
functions: updating Node.js 8 function helloWorld(us-central1)...
可悲的是它兑现
Error: Error: Failed to launch chrome!
[0408/080847.149912:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md
at startPuppeteer.then.then.then.catch.error (/srv/index.js:42:15)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7)
在本地测试了相同的代码,该代码有效。
那是失败的云功能代码。
const functions = require('firebase-functions');
const puppeteer = require('puppeteer');
let browser = ""
let page = ""
const startPuppeteer = async () => {
browser = await puppeteer.launch();
page = await browser.newPage()
}
const usePageInPuppeteer = async (url) => {
await page.goto(url);
return await page.title()
}
const closePuppeteer = async () => {
return await browser.close();
}
const runtimeOpts = {
timeoutSeconds: 500,
memory: '2GB'
}
exports.helloWorld = functions
.runWith(runtimeOpts)
.https.onRequest((request, response) => {
//response.send()
startPuppeteer()
.then(() => {
return usePageInPuppeteer('https://www.google.com')
})
.then(returnUse => {
console.log(returnUse)
return response.send(returnUse)
})
.then(() => {
return closePuppeteer()
})
.catch(error => {
throw new Error(error)
});
});
本地测试,有效
const puppeteer = require('puppeteer');
let browser = ""
let page = ""
const startPuppeteer = async () => {
browser = await puppeteer.launch();
page = await browser.newPage()
}
const usePageInPuppeteer = async (url) => {
await page.goto(url);
return await page.title()
}
const closePuppeteer = async () => {
return await browser.close();
}
startPuppeteer()
.then(() => {
return usePageInPuppeteer('https://www.google.com')
})
.then(returnUse => {
console.log(returnUse)
return closePuppeteer()
})
.catch(error => {
throw new Error(error)
});
解决方案
const startPuppeteer = async () => {
browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
page = await browser.newPage()
}
推荐阅读
- php - 如何使用 Bootstrap 4 Accordion 为垂直侧边栏菜单制作 Wordpress Walker 类?
- javascript - 图像坐标到视口坐标的错误转换 - openseadragon svgOverlay
- pyspark - AWS Glue 作业方法 pyWriteDynamicFrame 不存在
- c# - C# 对象序列化安全和最佳方法?谁能给我ans?
- javascript - 如何使用 JavaScript ES6 过滤和转换这个集合?
- apache-poi - Apache POI - 重新排序行
- python - Web抓取请求停止工作,在python中显示“响应[401]”?
- python-3.x - 如何将 Pyglet 与 Twisted/Asyncio 集成?
- java - 如何在 Java 中加密和解密 sqlite3 数据库?
- hive - presto + hive.metastore.uri + presto worker 如何连接到 hive Metastore