部署Node.js应用到Heroku时遭遇bcrypt的invalid ELF header错误
为啥会出现这问题?
本质是你本地(比如Windows/macOS)编译的bcrypt二进制文件,和Heroku的Linux服务器环境不兼容。就算换成bcryptjs还报错,大概率是缓存没清干净,或者部署流程没走对。
一步步解决:
先检查.gitignore配置
你的.gitignore必须包含这些内容,别把本地的node_modules和缓存文件提交到Git:node_modules/ npm-debug.log yarn-error.log .build/如果之前不小心提交过
node_modules,执行这俩命令清Git缓存:git rm -r --cached node_modules git commit -m "移除Git中的node_modules"给Heroku加build脚本
在package.json里加个heroku-postbuild脚本,让Heroku部署时重新编译依赖:{ "scripts": { "start": "node server.js", "heroku-postbuild": "npm install" } }用yarn的话就改成
yarn install。本地清缓存后重新部署
本地先彻底清干净:rm -rf node_modules package-lock.json yarn.lock npm install然后提交代码重新部署:
git add . git commit -m "修复bcrypt编译问题" git push heroku main如果坚持用bcrypt(不用bcryptjs)
别让本地编译二进制包,让Heroku自己从源码编译。安装时可以用npm install bcrypt --build-from-source,或者直接在package.json指定版本,让Heroku部署时自动处理。排查bcryptjs没生效的情况
换了bcryptjs还报错?检查代码里是不是还有地方引用bcrypt,比如require('bcrypt')或者import bcrypt from 'bcrypt',全部改成bcryptjs:// 原来的代码 const bcrypt = require('bcrypt'); // 改成 const bcrypt = require('bcryptjs');同时确保已经卸载了bcrypt:
npm uninstall bcrypt npm install bcryptjs
部署完后,再跑heroku logs --tail看看,要是没再出现invalid ELF header的错误,就搞定了。
内容的提问来源于stack exchange,提问作者franklincodes

