You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署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/**/*

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后提交

4. 缓存或构建环境问题

  • 解决:
    • 在Heroku控制台手动清除构建缓存(可通过CLI执行heroku builds:cache:purge,或在应用设置中找到清除缓存选项)
    • 重新触发部署

内容的提问来源于stack exchange,提问作者unni_ramachandran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:10:56