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

登录页面无法正确跳转至私密页面问题求助

登录验证始终提示密码错误的排查与解决

问题概述

搭建Express注册登录页面时,注册功能正常(返回“data has been saved”,控制台能输出用户名和明文密码),但登录接口添加await到bcrypt.compare后,无论输入密码是否正确,都会提示“Password incorrect”。此前未加await时,会直接进入secret页面(因为bcrypt.compare返回Promise,非布尔值,!isMatch始终为false)。

核心问题根源

注册接口中未将加密后的密码存入数据库,而是直接存储了用户输入的明文密码:
在bcrypt.hash回调中,创建User实例时使用的是原始password(来自req.body),而非生成的hash值。导致登录时,bcrypt.compare拿用户输入的明文密码和数据库里的明文密码对比(bcrypt.compare要求第二个参数是加密后的hash),永远无法匹配。

错误代码片段(注册接口):

bcrypt.hash(password, salt, (err, hash)=>{
  // 此处错误:使用了原始password,而非hash
  let newUser = new User({username, password})
  // ...保存逻辑
})

修复步骤

1. 修正注册接口的密码存储逻辑

将生成的hash赋值给User实例的password字段:

app.post("/signup", (req,res, next)=>{
  let {username, password} = req.body
  bcrypt.genSalt(saltRounds, (err, salt)=>{
    if (err){
      next(err)
    }
    bcrypt.hash(password, salt, (err, hash)=>{
      // 关键修改:用hash替代原始password
      let newUser = new User({username, password: hash})
      try{
        newUser.save().then(()=>{
          console.log(req.body)
          res.send("data has been saved")
        }).catch((e)=>{
          res.send("error")
          console.log(e)
        })
      }catch(e){
        next(e)
      }
    })
  })
})

2. 优化注册接口的异步写法(可选)

用async/await替代嵌套回调,提升代码可读性:

app.post("/signup", async (req,res, next)=>{
  try {
    let {username, password} = req.body
    const salt = await bcrypt.genSalt(saltRounds)
    const hash = await bcrypt.hash(password, salt)
    const newUser = new User({username, password: hash})
    await newUser.save()
    console.log(req.body)
    res.send("data has been saved")
  } catch(e) {
    next(e)
  }
})

3. 保留登录接口的正确写法

确保bcrypt.compare前添加await,获取正确的布尔匹配结果:

app.post("/login", async (req, res, next) => {
  let { username, password } = req.body;
  try {
    let foundUser = await User.findOne({ username });
    if (!foundUser) {
      res.send("User not found");
    } else {
      const isMatch = await bcrypt.compare(password, foundUser.password);
      if (!isMatch) {
        res.send("Password incorrect");
      } else {
        res.render("secret");
      }
    }
  } catch (e) {
    next(e);
  }
});

额外注意事项

  • 修复后需重新注册用户,确保数据库中存储的是加密后的密码
  • 检查User模型的password字段类型,确保为String类型,能存储bcrypt生成的hash字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:05:20