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

求助:解决博客应用在Heroku部署时的bcrypt运行错误

问题描述

我是一名开发新手,相信问题出在某个显而易见的地方。这是一个简单的博客发布应用。

以下是日志信息:

2022-08-06T05:01:07.613012+00:00 heroku[web.1]: State changed from crashed to starting
2022-08-06T05:01:09.866047+00:00 heroku[web.1]: Starting process with command `npm start`
2022-08-06T05:01:11.802781+00:00 app[web.1]: 
2022-08-06T05:01:11.802803+00:00 app[web.1]: > webdev-blogpub@1.0.0 start
2022-08-06T05:01:11.802803+00:00 app[web.1]: > node server.js
2022-08-06T05:01:11.802803+00:00 app[web.1]: 
2022-08-06T05:01:12.261482+00:00 app[web.1]: node:internal/modules/cjs/loader:1189
2022-08-06T05:01:12.261495+00:00 app[web.1]: return process.dlopen(module, path.toNamespacedPath(filename));
2022-08-06T05:01:12.261496+00:00 app[web.1]: ^
2022-08-06T05:01:12.261496+00:00 app[web.1]: 
2022-08-06T05:01:12.261497+00:00 app[web.1]: Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header
2022-08-06T05:01:12.261498+00:00 app[web.1]: at Object.Module._extensions..node (node:internal/modules/cjs/loader:1189:18)
2022-08-06T05:01:12.261498+00:00 app[web.1]: at Module.load (node:internal/modules/cjs/loader:981:32)
2022-08-06T05:01:12.261499+00:00 app[web.1]: at Function.Module._load (node:internal/modules/cjs/loader:822:12)
2022-08-06T05:01:12.261499+00:00 app[web.1]: at Module.require (node:internal/modules/cjs/loader:1005:19)
2022-08-06T05:01:12.261499+00:00 app[web.1]: at require (node:internal/modules/cjs/helpers:102:18)
2022-08-06T05:01:12.261500+00:00 app[web.1]: at Object.<anonymous> (/app/node_modules/bcrypt/bcrypt.js:6:16)
2022-08-06T05:01:12.261500+00:00 app[web.1]: at Module._compile (node:internal/modules/cjs/loader:1105:14)
2022-08-06T05:01:12.261500+00:00 app[web.1]: at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
2022-08-06T05:01:12.261500+00:00 app[web.1]: at Module.load (node:internal/modules/cjs/loader:981:32)
2022-08-06T05:01:12.261501+00:00 app[web.1]: at Function.Module._load (node:internal/modules/cjs/loader:822:12) {
2022-08-06T05:01:12.261501+00:00 app[web.1]: code: 'ERR_DLOPEN_FAILED'
2022-08-06T05:01:12.261501+00:00 app[web.1]: }
2022-08-06T05:01:12.447473+00:00 heroku[web.1]: Process exited with status 1
2022-08-06T05:01:12.514128+00:00 heroku[web.1]: State changed from starting to crashed
2022-08-06T05:01:34.971754+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=webdev-blogpub.herokuapp.com request_id=1a97248d-cbfb-49c2-9a66-7387a694050d fwd="184.91.86.250" dyno= connect= service= status=503 bytes= protocol=https
2022-08-06T05:01:35.240071+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=webdev-blogpub.herokuapp.com request_id=7347a626-2ad0-4544-a735-b097c232c83d fwd="184.91.86.250" dyno= connect= service= status=503 bytes= protocol=https
2022-08-06T05:03:26.310277+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=webdev-blogpub.herokuapp.com request_id=8f258b45-8c3f-409c-b783-74b6e922de58 fwd="184.91.86.250" dyno= connect= service= status=503 bytes= protocol=https
2022-08-06T05:03:26.806445+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=webdev-blogpub.herokuapp.com request_id=396e2ae6-f5b6-46bc-8950-6c4f30c24a39 fwd="184.91.86.250" dyno= connect= service= status=503 bytes= protocol=https
2022-08-06T05:06:02.706235+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=webdev-blogpub.herokuapp.com request_id=1743caa9-b5a1-41e0-8906-7060278358ef fwd="184.91.86.250" dyno= connect= service= status=503 bytes= protocol=https
2022-08-06T05:06:02.914897+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=webdev-blogpub.herokuapp.com request_id=9e55e940-3fe6-4434-ac79-f9f09f9de4c2 fwd="184.91.86.250" dyno= connect= service= status=503 bytes= protocol=https
解决方案

这个问题是因为bcrypt是原生Node.js模块,它需要在对应系统环境下编译二进制文件。你本地(比如Windows/macOS)编译的bcrypt文件,和Heroku的Linux服务器环境不兼容,导致加载时出现invalid ELF header错误。按以下步骤修复:

  • 第一步:确保本地的node_modules和锁文件不会被提交到Git
    把以下内容添加到.gitignore文件里:

    node_modules/
    package-lock.json
    yarn.lock
    

    如果已经提交过这些文件,先执行命令删除缓存:

    git rm -r --cached node_modules
    git rm --cached package-lock.json
    
  • 第二步:让Heroku部署时重新编译bcrypt
    在项目根目录的package.json里添加heroku-postbuild脚本:

    "scripts": {
      "start": "node server.js",
      "heroku-postbuild": "npm rebuild bcrypt --build-from-source"
    }
    

    这个脚本会在Heroku安装完依赖后,重新从源码编译bcrypt,适配Linux环境。

  • 第三步:重新部署代码
    提交修改并推送到Heroku:

    git add .gitignore package.json
    git commit -m "修复Heroku上bcrypt兼容性问题"
    git push heroku main
    

完成后重新启动应用,应该就能正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:15:37