Node.js中bcrypt.compare返回undefined致登录校验失败问题
登录验证中bcrypt.compare返回undefined的问题修复
问题根源
- 混用bcrypt.compare的两种调用模式:bcrypt.compare支持回调和Promise两种方式,但你同时用了
await和回调函数。当传入回调时,函数不会返回Promise,所以await后的isValidPassword必然是undefined,导致!isValidPassword永远为真,直接返回错误。 - 异步回调的变量时机问题:
validStatus的赋值在回调函数里,而console.log(validStatus)是在回调执行前调用的,此时变量还没被赋值,所以输出undefined。 - 冗余代码:登录逻辑里的
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
相关产品推荐
相关产品推荐

