Heroku部署应用后调用API报错:bcrypt invalid ELF header 求助
问题描述
我已经把应用部署到Heroku平台了,但调用刚开发的API时出现报错,本地运行完全正常,全网搜了一圈没找到解决办法,错误日志如下:
2018-05-19T06:51:35.980033+00:00 app[web.1]: return process.dlopen(module, path._makeLong(filename)); 2018-05-19T06:51:35.980014+00:00 app[web.1]: module.js:681 2018-05-19T06:51:35.980037+00:00 app[web.1]: 2018-05-19T06:51:35.980035+00:00 app[web.1]: ^ 2018-05-19T06:51:35.980042+00:00 app[web.1]: at Module.load (module.js:565:32) 2018-05-19T06:51:35.980038+00:00 app[web.1]: Error: /app/node_modules/bcrypt/lib/binding/bcrypt_lib.node: invalid ELF header
解决方案
这个问题其实很常见,核心原因是你本地编译的bcrypt模块和Heroku的Linux环境不兼容——bcrypt是依赖本地系统编译的二进制模块,你在Windows/macOS上编译出来的文件,放到Linux环境下就会出现invalid ELF header(ELF是Linux专属的可执行文件格式)。下面给你两种靠谱的解决办法:
方法一:让Heroku重新编译依赖
这是最推荐的原生解决方式,步骤如下:
- 先清理本地的依赖文件和锁文件,避免把本地编译的二进制包提交到仓库:
rm -rf node_modules rm package-lock.json # 用npm的话执行这个 rm yarn.lock # 用yarn的话执行这个 - 检查你的
.gitignore文件,确保node_modules/已经被加入忽略规则(如果没有就新建.gitignore并添加这行),这样本地依赖就不会被推送到Git仓库:node_modules/ - 提交修改后的代码:
git add . git commit -m "Fix bcross-platform compatibility for bcrypt on Heroku" - 重新推送到Heroku,让平台在Linux环境下重新安装并编译
bcrypt:git push heroku main # 如果你的主分支是master就换成master
方法二:改用纯JS版本的bcryptjs
如果上面的方法还是不行,或者你不想折腾编译问题,可以直接替换成纯JavaScript实现的bcryptjs,它不需要编译,跨平台兼容性拉满:
- 卸载原有的
bcrypt,安装bcryptjs:npm uninstall bcrypt npm install bcryptjs - 把代码里所有引用
bcrypt的地方改成bcryptjs,比如:// 原来的代码 const bcrypt = require('bcrypt'); // 改成 const bcrypt = require('bcryptjs'); - 提交修改后重新部署到Heroku就可以了。
内容的提问来源于stack exchange,提问作者jdotdoe
相关产品推荐
相关产品推荐

