Puppeteer 16.1.1与chrome-aws-lambda 10.1.0兼容异常求助
解决AWS Lambda升级Node.js 16.x+Puppeteer 16.1.1后的PDF生成报错问题
问题背景
原Node.js 12.x + Puppeteer v13.7.0 + chrome-aws-lambda v10.1.0组合在AWS Lambda中生成PDF正常,升级至Node.js 16.x、Puppeteer v16.1.1后出现以下错误:
error: Error: ENOENT: no such file or directory, mkdtemp 'undefined\temp\puppeteer_dev_chrome_profile-XXXXXX' {errno: -4058, code: 'ENOENT', syscall: 'mkdtemp', path: 'undefined\temp\puppeteer_dev_chrome_profile-XXXXXX', stack: 'Error: ENOENT: no such file or directory, mkd…ned\temp\puppeteer_dev_chrome_profile-XXXXXX'', …} code: 'ENOENT' errno: -4058 path: 'undefined\temp\puppeteer_dev_chrome_profile-XXXXXX' syscall: 'mkdtemp' message: 'ENOENT: no such file or directory, mkdtemp 'undefined\temp\
解决方案
1. 匹配chrome-aws-lambda与Puppeteer版本
旧版chrome-aws-lambda v10.1.0不兼容Puppeteer 16.x,需安装对应版本的依赖:
npm install chrome-aws-lambda@16.1.1
(版本号需与Puppeteer完全一致,确保Chromium二进制文件匹配)
2. 手动指定临时目录路径
报错核心是Puppeteer无法识别正确的临时目录路径(出现undefined),需在浏览器启动配置中明确指定userDataDir为Lambda默认临时目录/tmp下的路径:
const fs = require('fs'); const puppeteer = require('puppeteer-core'); const chrome = require('chrome-aws-lambda'); // 提前创建临时目录确保存在 const tempProfileDir = '/tmp/puppeteer_dev_chrome_profile'; fs.mkdirSync(tempProfileDir, { recursive: true }); const browser = await puppeteer.launch({ args: chrome.args, executablePath: await chrome.executablePath, headless: chrome.headless, userDataDir: tempProfileDir, ignoreHTTPSErrors: true, });
3. 调整环境变量读取逻辑
Node.js 16.x对环境变量的处理有变化,可通过系统环境变量动态获取临时目录:
const tempProfileDir = `${process.env.TMPDIR}/puppeteer_dev_chrome_profile`;
4. 确认Lambda权限
确保Lambda执行角色拥有/tmp目录的读写权限(默认已具备,若自定义权限策略需验证)。
内容的提问来源于stack exchange,提问作者Maruti Jadhav
相关产品推荐
相关产品推荐

