You need to enable JavaScript to run this app. Node.js登录时触发Cannot read property 'password' of undefined错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Node.js登录时触发Cannot read property 'password' of undefined错误如何解决

故障根因
  • JavaScript中空数组[]属于真值,你的判断条件!results无法过滤空数组场景:当输入无效用户时,数据库返回空数组[],!results判定为false,逻辑或会继续执行右侧的results[0].password调用,此时results[0]为undefined,读取password属性就触发了对应报错。
  • 你目前完全未处理db.query回调的error参数,若数据库查询本身出现异常,也会导致未知报错。
修复方案

将db.query回调内的判断逻辑修改为如下内容即可:

db.query('SELECT * FROM users2 WHERE email = ?' , [email], async(error,results) =>{
    // 先处理查询报错
    if(error) {
        console.log(error);
        res.clearCookie('myEmail');
        return res.status(500).render('login', {
            message:'服务器内部错误,请稍后重试'
        })
    }
    console.log(results);
    // 先判断结果数组长度是否为0,无匹配用户直接走错误分支,不会执行后续密码比对
    if(results.length === 0 || !(await bcrypt.compare(password,results[0].password))){
        res.clearCookie('myEmail');
        return res.status(401).render('login', {
            message:'Email or password is incorrect'
        })
    }
    // 原有正常登录逻辑不变
    const id= results[0].id;
    const token = jwt.sign({id: id}, process.env.JWT_SECRET,{
        expiresIn:process.env.JWT_EXPIRES_IN
    });
    console.log("the token is"+token)
    const cookieOptions ={
        expires: new Date(
            Date.now()+process.env.JWT_EXPIRES *24*60*60*1000
        ),
        httpOnly:true
    }
    res.cookie('jwt',token,cookieOptions);
    res.status(200).redirect("/userPage")
})
附加潜在问题修复

你当前的loggedUser中间件存在逻辑缺陷:当req.cookies['myEmail']!=null触发重定向后,代码仍会执行return next(),可能会抛出「响应头已发送」的异常,建议修改为:

function loggedUser(req,res,next){
    if(req.cookies['myEmail']!=null){
        return res.redirect('userPage')
    }
    next()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 17:36:07