这个错误是由于 macOS 的安全策略(Gatekeeper)阻止了未签名的原生模块(bcrypt_lib.node
)加载 导致的。以下是具体解决方案:
1. 临时允许加载未签名模块(推荐先尝试)
在终端运行以下命令,临时解除限制:
sudo xattr -r -d com.apple.quarantine /Users/chengchen/Documents/666\ documents/666/666book/server/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node
此命令会移除 macOS 对该文件的隔离标记(quarantine)。
2. 完全重建 bcrypt
模块
确保编译环境正确后,彻底重新编译:
cd /Users/chengchen/Documents/666\ documents/666/666book/server
npm rebuild bcrypt --update-binary
如果失败,尝试强制重新安装:
npm uninstall bcrypt
npm install bcrypt --force
3. 检查 Xcode 命令行工具
确保已安装最新版本:
xcode-select --install
然后同意许可协议:
sudo xcodebuild -license accept
4. 修改 macOS 安全性设置(谨慎操作)
如果上述方法无效,临时放宽安全策略(仅限开发环境):
- 打开系统设置 → 隐私与安全性。
- 在底部找到提示 “已阻止加载 bcrypt_lib.node”,点击 “仍要允许”。
- 重启终端后再运行项目。
5. 终极方案:换用 bcryptjs
如果仍无法解决,使用纯 JavaScript 实现的替代库:
npm uninstall bcrypt
npm install bcryptjs
然后在代码中将:
const bcrypt = require('bcrypt');
替换为:
const bcrypt = require('bcryptjs');
(两者 API 完全兼容,但 bcryptjs
性能略低)
关键原因说明
- macOS Gatekeeper 会阻止加载未经验证签名的二进制文件(尤其是从网络下载的)。
bcrypt
的预编译二进制文件可能因路径含空格(666 documents
)或权限问题被标记为不安全。- 解决方案的核心是 让系统信任该文件 或 绕过限制(仅限开发环境)。