求助:解决博客应用在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
相关产品推荐
相关产品推荐

