You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:36:05