【问题标题】:Puppeteer in firebase functions failed to launch chromefirebase 函数中的 Puppeteer 无法启动 chrome
【发布时间】:2019-04-08 08:26:06
【问题描述】:

我尝试在 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)
});

【问题讨论】:

  • Running as root without --no-sandbox is not supported. 从该消息看来,您似乎缺少用于运行扩展程序的标志 --no-sandbox

标签: javascript node.js firebase google-chrome puppeteer


【解决方案1】:
const startPuppeteer = async () => {
    browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
    page = await browser.newPage()
}

效果很好。感谢https://stackoverflow.com/users/2911633/igor-ilic 的提示

【讨论】:

    【解决方案2】:

    您需要在沙盒模式下启动 chrome。不支持直接以 root 身份运行 chrome,您可以传递参数 --no-sandbox 以以 root 用户身份启动它。 最终代码将如下所示

    browser = await puppeteer.launch({args: ['--no-sandbox']});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多