ElasticBeanstalk部署Node.js应用后遇502错误及mysql2语法问题
核心问题定位
错误日志显示SyntaxError: Unexpected token '(',指向lru-cache包中的私有方法语法#initializeTTLTracking(),说明当前运行环境的Node.js版本不支持该语法,或依赖包被意外升级到了不兼容的版本。
排查步骤
验证构建/运行环境的Node.js版本一致性
本地使用Node 14,需确认AWS CodePipeline构建环境、ElasticBeanstalk运行环境的Node版本是否严格匹配Node 14(注意:Node 14.6+才完整支持ES私有方法语法)。可在buildspec.yml中添加node -v命令输出版本,或在EB控制台查看运行环境配置。检查依赖锁定文件的使用情况
本地运行正常但构建环境出错,大概率是依赖树不一致:- 确认
package-lock.json或yarn.lock已提交到GitHub,CodePipeline构建时使用npm ci(而非npm install)命令,强制按锁定文件安装依赖,避免mysql2的子依赖lru-cache被自动升级到不兼容Node 14的版本。 - 对比本地与构建环境的依赖版本:在buildspec.yml中添加
npm list mysql2 lru-cache,查看构建日志中lru-cache的版本,若版本高于mysql2@3.1.2原本依赖的兼容版本(如v7.x系列),则说明依赖被意外升级。
- 确认
强制锁定lru-cache的兼容版本
在package.json中添加overrides字段(npm 8+支持),强制指定lru-cache为兼容Node 14的版本,示例:"overrides": { "lru-cache": "^7.14.1" }提交后重新构建部署,验证是否解决语法错误。
排查构建流程的变更
检查最近CodePipeline的buildspec.yml是否有修改:比如是否替换了npm ci为npm install,是否启用了node_modules缓存导致旧依赖复用,或者构建阶段的环境变量有变动。对比不同部署方式的差异
直接部署3月30日的构建包正常,但重新构建同分支出错,说明问题出在构建过程而非代码本身。需检查构建环境的依赖源(如npm镜像)是否变更,或AWS构建服务的底层环境是否有更新(比如默认npm版本升级)。
内容的提问来源于stack exchange,提问作者havab

