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

Node.js中bcrypt.compare返回undefined致登录校验失败问题

登录验证中bcrypt.compare返回undefined的问题修复

问题根源

  1. 混用bcrypt.compare的两种调用模式:bcrypt.compare支持回调和Promise两种方式,但你同时用了await和回调函数。当传入回调时,函数不会返回Promise,所以await后的isValidPassword必然是undefined,导致!isValidPassword永远为真,直接返回错误。
  2. 异步回调的变量时机问题:validStatus的赋值在回调函数里,而console.log(validStatus)是在回调执行前调用的,此时变量还没被赋值,所以输出undefined。
  3. 冗余代码:登录逻辑里的salt和genSalt完全没用,只有注册加密密码时才需要生成salt。

修复后的代码

const express=require('express');
const bcrypt=require('bcrypt');

const loginUser=async (req,res)=>{
       const {email,password}=req.body;
       try{
              const user=await userModel.findOne({email});

              if(!user) return res.status(400).json("invalid Username or password");
              
              // 改用纯异步/await模式获取验证结果
              const isValidPassword = await bcrypt.compare(password, user.password);
              
              if(!isValidPassword) return res.status(400).json("invalid Username or password");

              const token=createToken(user._id);
              res.status(200).json({_id:user.id,name:user.name,email,token});
       }
       catch(err)
       {
              console.log(err);
              // 补充服务器错误响应,避免请求挂起
              res.status(500).json("Server error");
       }
};

关键修复点

  • 移除无用的salt变量和genSalt调用
  • 去掉bcrypt.compare的回调函数,直接用await接收布尔类型的验证结果
  • 修正拼写错误:passowrd改为password
  • 在catch块中添加500状态码的错误响应,避免客户端请求无响应

内容的提问来源于stack exchange,提问作者user20898355

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:17:27