部署Node.js应用至Heroku时NPM依赖安装失败求助
Heroku部署Node.js应用依赖安装失败排查
问题描述
通过Heroku网页界面连接Git仓库部署Node.js应用时,依赖安装失败,具体错误日志如下:
-----> Building on the Heroku-22 stack -----> Determining which buildpack to use for this app -----> Node.js app detected -----> Creating runtime environment NPM_CONFIG_LOGLEVEL=error NODE_VERBOSE=false NODE_ENV=production NODE_MODULES_CACHE=true -----> Installing binaries engines.node (package.json): 12.x engines.npm (package.json): unspecified (use default) Resolving node version 12.x... Downloading and installing node 12.22.12... Using default npm version: 6.14.16 -----> Installing dependencies Installing node modules npm ERR! Cannot read property 'aws-sdk' of undefined npm ERR! A complete log of this run can be found in: npm ERR! /tmp/npmcache.XadcE/_logs/2024-03-10T17_02_48_371Z-debug.log -----> Build failed
package.json内容
{ "name": "xxxx", "version": "1.0.0", "engines": { "node": "12.x" }, "description": "Backend APIs for Customer microservice", "main": "server.js", "bin": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev", "start:prod": "node server.js", "start:dev": "nodemon server.js" }, "pkg": { "scripts": "build/**/*.js", "assets": [ "controllers/**/*", "database/**/*", "functions/*", "node_modules/**.*", "routes/**/*" ], "targets": [ "node12-macos-x64", "node12-win-x64", "node12-linux-x64" ], "outputPath": "build" }, "author": "xxxxx", "license": "ISC", "dependencies": { "aws-sdk": "^2.1381.0", "bcrypt": "^5.1.0", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "csv-parser": "^3.0.0", "csvtojson": "^2.0.10", "dotenv": "^16.0.0", "express": "^4.17.2", "express-session": "^1.17.3", "fs": "0.0.1-security", "jsonwebtoken": "^9.0.0", "moment": "^2.29.1", "mysql2": "^2.3.3", "path": "^0.12.7", "sequelize": "^6.15.1", "twilio": "^3.84.1", "@vonage/server-sdk": "^3.13.1" }, "devDependencies": { "concurrently": "^8.2.2", "nodemon": "^3.0.3" } }
已尝试操作
- 删除package-lock.json和node_modules
- 本地执行
npm i并提交新生成的package-lock.json - 本地启动应用并确认可正常运行
可能原因及解决建议
1. 依赖版本与Node.js 12.x不兼容
- 问题点:部分依赖要求的Node.js版本高于指定的12.x:
jsonwebtoken@9.0.0:官方要求Node.js >=14.0.0,在Node12环境下安装会触发兼容性错误concurrently@8.2.2:要求Node.js >=14.16.0,虽为dev依赖,但package-lock.json中的版本信息可能干扰npm解析
- 解决:
- 将
jsonwebtoken降级至支持Node12的版本,比如^8.5.1 - 将
concurrently降级至支持Node12的版本,比如^6.5.1 - 检查其他依赖版本,确保所有依赖均兼容Node.js 12.x
- 将
2. package.json中pkg字段配置干扰
- 问题点:
pkg字段用于打包Node应用,其中assets里的node_modules/**.*通配符格式错误(应为node_modules/**/*),可能导致npm安装时解析依赖路径出错 - 解决:
- 若无需在Heroku上使用
pkg打包,直接移除整个pkg字段 - 若需要保留,修正
assets中的通配符为node_modules/**/*
- 若无需在Heroku上使用
3. npm版本不匹配
- 问题点:本地可能使用高于6.x的npm版本生成package-lock.json,而Heroku使用Node12对应的默认npm 6.14.16,不同版本npm生成的lock文件格式存在兼容性问题,导致解析失败
- 解决:
- 在package.json的
engines字段中指定npm版本:"engines": { "node": "12.x", "npm": "6.x" } - 本地切换至Node12 + npm6环境,重新执行
npm install生成兼容的package-lock.json后提交
- 在package.json的
4. 缓存或构建环境问题
- 解决:
- 在Heroku控制台手动清除构建缓存(可通过CLI执行
heroku builds:cache:purge,或在应用设置中找到清除缓存选项) - 重新触发部署
- 在Heroku控制台手动清除构建缓存(可通过CLI执行
内容的提问来源于stack exchange,提问作者unni_ramachandran
相关产品推荐
相关产品推荐

