Node.js后端使用bcryptjs做登录校验时出现bcrypt.compare不是函数报错
问题原因
- bcrypt模块导入语法错误
你当前代码中的导入语句为const bcrypt = ('bcryptjs');,缺少require关键字,此时bcrypt变量的实际值是普通字符串'bcryptjs',而非bcryptjs模块导出的工具对象。字符串原型上不存在compare、genSalt等方法,这是报错的核心诱因。你提到的hashSync可正常运行大概率是测试场景和当前代码不匹配,或者全局环境存在其他冲突导入。 - 业务逻辑缺失
调用bcrypt.compare时传入的第二个参数hash未定义,你需要从数据库查询返回的用户数据中,取出提前加密存储的密码字段赋值给该参数。
解决步骤
- 修正bcrypt的导入语句,改为标准的CommonJS导入写法:
const bcrypt = require('bcryptjs');
- 补全登录接口的密码校验逻辑,从查询结果中获取存储的加密密码,补全后参考代码如下:
app.post("/login", (req, response) => { const email = req.body.email; const password = req.body.password; if (email && password) { db.query( "SELECT * FROM users WHERE email = ? LIMIT 1", [email], (err, result) => { if (err) { console.log(err); return response.status(500).json({ msg: "数据库查询异常" }); } if (result.length === 0) { return response.status(400).json({ msg: "当前邮箱未注册" }); } // 取数据库中存储的加密密码 const storedPasswordHash = result[0].password; bcrypt.compare(password, storedPasswordHash, (err, isMatch) => { if (err) { console.log(err); return response.status(500).json({ msg: "密码校验失败" }); } if (isMatch) { // 此处添加登录成功后的逻辑,例如生成token返回 return response.json({ msg: "登录成功" }); } else { return response.status(400).json({ msg: "邮箱或密码错误" }); } }); } ); } else { return response.status(400).json({ msg: "请输入完整的邮箱和密码" }); } });
- 确认依赖安装正常:在项目根目录执行
npm list bcryptjs检查依赖是否存在,若提示未安装,执行npm install bcryptjs安装即可。
内容的提问来源于stack exchange,提问作者Yonatan
相关产品推荐
相关产品推荐

