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
相关产品推荐
相关产品推荐

