Node.js登录API:从对象数组取值返回undefined问题排查
问题分析与解决方案
嘿,我一眼就揪出你代码里的问题啦!你用users.find()查询返回的结果是一个数组——哪怕只有一个匹配的用户,它也会把这个用户对象塞进数组里返回,你现在直接用user.role去访问,相当于在数组上找role属性,这肯定会返回undefined呀!
而且你生成JWT的时候写的user._id也有同样的问题,数组本身根本没有_id属性,这也会埋下隐患的。
给你两种简单的修复方案:
方案1:改用findOne()方法
findOne()会直接返回匹配到的单个用户对象(如果存在的话),不用再折腾数组:
users.findOne({ username: req.body.username, password: req.body.password }, (err, user) => { if (user) { // 找到有效用户就进入逻辑 var token = jwt.sign( { userID: user._id, username: user.username }, // 用数据库里的username更可靠 'user_authenticate', { expiresIn: '10d' } ); res.status(200).send({ token: token, role: user.role }); } else { // 别忘了加找不到用户的处理逻辑 res.status(401).send('用户名或密码错误'); } });
方案2:如果坚持用find(),访问数组的第一个元素
既然你已经判断了user.length == 1,那直接取数组的第0个元素就行:
users.find({ username: req.body.username, password: req.body.password }, (err, user) => { if (user.length == 1) { const targetUser = user[0]; // 取出数组里的真实用户对象 var token = jwt.sign( { userID: targetUser._id, username: targetUser.username }, 'user_authenticate', { expiresIn: '10d' } ); res.status(200).send({ token: token, role: targetUser.role }); } else { res.status(401).send('用户名或密码错误'); } });
小提醒:用user.username代替req.body.username会更稳妥,避免前端传入的用户名和数据库存储的不一致(虽然你已经用它查询了,但多一层校验总是没坏处的)。
内容的提问来源于stack exchange,提问作者Karthi
相关产品推荐
相关产品推荐

