/tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 Vercel

新手上路,请多包涵

当我尝试访问我上传到 Vercel 服务器上的 API 时,出现此错误。

有没有人有同样的错误?

当我在本地运行它时,它工作正常。

2021-02-15T19:38:59.218Z 0109b575-a2e7-478e-aefe-aa3335b5b6b8 错误错误:无法启动浏览器进程! /tmp/chromium:加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录故障排除: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md at onClose (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:193:20) 在接口处。 (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:183:68) 在 Interface.emit (events.js:327:22) 在 Interface.close (readline.js: 424:8) 在 Socket.onend (readline.js:202:10) 在 Socket.emit (events.js:327:22) 在 endReadableNT (internal/streams/readable.js:1327:12) 在 processTicksAndRejections (internal/进程/task_queues.js:80:21)

代码

import puppeteer, { Page } from 'puppeteer-core'
import chrome from 'chrome-aws-lambda'

export async function getOptions() {
  const isDev = !process.env.AWS_REGION
  let options;

  const chromeExecPaths = {
    win32: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
    linux: '/usr/bin/google-chrome',
    darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
  }

  const exePath = chromeExecPaths[process.platform]

  if (isDev) {
    options = {
      args: [],
      executablePath: exePath,
      headless: true
    }
  } else {
    options = {
      args: chrome.args,
      executablePath: await chrome.executablePath,
      headless: chrome.headless
    }
  }

  return options
}

let _page: Page | null
async function getPage(): Promise<Page> {
  if (_page) {
    return _page
  }

  const options = await getOptions()
  const browser = await puppeteer.launch(options)

  _page = await browser.newPage()

  return _page
}

export async function getScreenshot(html: string, { width, height } = { width: 800, height: 800 }) {
  const page = await getPage();

  await page.setContent(html);
  await page.setViewport({ width, height });

  const file = await page.screenshot({ type: 'png' });

  return file;
}

原文由 Lucas Borim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

我遇到了同样的问题,puppeteer 在我的本地环境中运行正常,但是当我部署到 AWS EC2 时,我遇到了同样的错误 共享加载库 解决方案

  1. 首先检查您正在运行的 nodejs 版本,如果它不 低于 v14.0 或高于 v14.0 。升级或降级( _建议升级_)并重新启动您的应用程序,然后尝试。

最常见的原因是 Node.js v14.0.0 中的一个错误,它破坏了 extract-zip,Puppeteer 用来将浏览器下载提取到正确位置的模块。该错误已在 Node.js v14.1.0 中修复,因此请确保您运行的是该版本或更高版本。或者,如果您无法升级,您可以降级到 Node.js v12,但我们建议尽可能升级。

  1. 琐碎:- 确保项目文件夹所在的目录不属于 root。

对于那些在 Windows 环境中运行时可能遇到此问题的人,您可以尝试在从代码启动铬时传递 ignoreDefaultArgs: [’–disable-extensions’] 选项,即

const browser = await puppeteer.launch({ignoreDefaultArgs: ['--disable-extensions']})

这将停用 puppeteer 的默认行为,禁止禁用 chrome/chrome 通常使用的任何扩展。

Linux 和 MACOS 使用

导致此错误的问题

UnhandledPromiseRejectionWarning:错误:无法启动浏览器进程!加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录

大多数情况下但并非所有情况都是由于缺少最新版本所需的依赖项造成的。好处是您可以轻松检查导致崩溃的缺失 chrome 依赖项。

  • 确保您位于项目的根文件夹中
  • 导航到 node_modules 文件夹
  • 导航到安装 puppeteer chrome Linux 工具的文件夹
  • cd /project_folder/node_modules/puppeteer/.local-chromium/ linux- some number /chrome-linux

用 ls 将输出的任何内容替换 linux-some 数字 - ls at /.local-chromium 检查目录名称

  • 在最后一个目录 [chrome-linux] 运行下面的命令来检查缺少的依赖项

ldd铬| grep 不是

如果您看到任何缺少的依赖项,请运行此命令以安装所有内容并重新启动您的应用程序。

 sudo apt-get install ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils

瞧!一切都应该是固定的

原文由 Andrew Mititi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题