這個錯誤是由于 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
)或權限問題被標記為不安全。- 解決方案的核心是 讓系統信任該文件 或 繞過限制(僅限開發環境)。