使用Node SEA打包exe时,@puppeteer/browsers.install报404错误求助
使用@puppeteer/browsers安装Chrome时404错误的解决方法
我正在开发一个用Node SEA将代码打包为.exe的项目,因打包puppeteer需自行安装Chrome,故切换为puppeteer-core + @puppeteer/browsers组合。但本地安装Chrome时触发404错误:
Error in main function: Error: Got status code 404 at C:\Users\user\OneDrive\Desktop\core changes\node_modules\@puppeteer\browsers\lib\cjs\httpUtil.js:135:31 at ClientRequest.requestCallback (C:\Users\user\OneDrive\Desktop\core changes\node_modules\@puppeteer\browsers\lib\cjs\httpUtil.js:72:13) at Object.onceWrapper (node:events:634:26) at ClientRequest.emit (node:events:519:28)
我判断问题出在安装选项上,但pptr官方文档未提供有效值上下文,网上也找不到选项变量的赋值示例,无法定位具体原因,寻求帮助。
我的代码如下:
const fs = require('node:fs'); const path = require('node:path'); const puppeteerBrowsers = require('@puppeteer/browsers'); const puppeteer = require('puppeteer-core'); const cacheDir = path.join(os.homedir(), '.CSVtoPDF', 'cache'); if(!fs.existsSync(cacheDir)){ fs.mkdirSync(path.join(os.homedir(), '.CSVtoPDF')); fs.mkdirSync(cacheDir); } const installedBrowsers = await puppeteerBrowsers.getInstalledBrowsers({cacheDir}); if(installedBrowsers.length === 0){ let browserInfo = await puppeteerBrowsers.install({ browser: 'chrome', buildId: '1300313', cacheDir, }); } // puppeteer-core 相关代码
问题分析
- 缺失模块引入:代码中使用了
os.homedir()但未引入os模块,会导致运行时错误,虽不是当前404的直接原因,但必须修复。 - 安装参数不匹配:404的核心原因是
buildId与当前系统平台/架构不匹配,或未明确指定platform和arch参数,导致@puppeteer/browsers请求了不存在的Chrome安装包资源。不同系统对应的buildId存在差异,若手动指定的buildId无对应平台的安装包,就会返回404。
解决方案
1. 补全os模块引入
在代码顶部添加:
const os = require('node:os');
2. 自动匹配对应平台的最新稳定版(推荐)
无需手动指定buildId,让工具自动获取适配当前系统的Chrome稳定版:
if(installedBrowsers.length === 0){ let browserInfo = await puppeteerBrowsers.install({ browser: 'chrome', channel: 'stable', // 指定安装稳定通道版本 cacheDir, }); }
3. 手动指定匹配的buildId、platform和arch
若必须固定版本,需确认buildId对应你的系统版本,同时明确指定平台和架构:
if(installedBrowsers.length === 0){ let browserInfo = await puppeteerBrowsers.install({ browser: 'chrome', buildId: '1300313', // 确保此buildId适配你的系统 platform: 'win64', // 可选值:win64、linux64、mac-arm64、mac-x64等 arch: 'x64', cacheDir, }); }
4. 验证buildId有效性
可先调用工具接口获取对应通道的有效buildId,避免手动指定错误:
const versionInfo = await puppeteerBrowsers.resolveBrowserVersion({ browser: 'chrome', channel: 'stable', }); console.log('当前平台有效buildId:', versionInfo.buildId);
内容的提问来源于stack exchange,提问作者BinarySolo
相关产品推荐
相关产品推荐

