Node.js+Express+MongoDB登录系统数据库值为undefined问题求助
问题根源:
User.find() 返回的是数组而非单个对象 嘿,这问题我一眼就看穿啦!你控制台输出undefined的核心原因是——User.find() 方法返回的是包含匹配文档的数组,不是单个用户对象。你现在直接用user.email、user.password,本质上是在给数组对象找这些属性,数组本身当然没有这些属性,结果自然是undefined。
解决方案1:改用 User.findOne()(推荐)
如果你只需要找匹配的单个用户,findOne() 会直接返回第一个匹配的文档对象,这样就能正常访问用户属性了:
app.post("/login", (req, res) => { // 获取用户字段 const userEmail = req.body.loginEmail; const userPass = req.body.loginPassword; // 用findOne查找单个匹配用户 User.findOne({ email: userEmail }, (err, user) => { // 先处理用户不存在的情况 if (!user) { return res.send("该邮箱未注册"); } if (err) { return res.send(err); } console.log("database email: " + user.email) // 仅用bcrypt.compare对比哈希密码(别直接对比明文!) bcrypt.compare(userPass, user.password, (err, result) => { if (err) { return res.send(err); } console.log("database password: " + user.password); // 根据bcrypt的验证结果判断 if (result) { if (user.isVerified) { res.redirect("/success"); } else { res.send( "您的账户未验证,请查看邮箱以访问账户。" ); } } else { res.send("密码错误"); } }); }); });
解决方案2:保留User.find(),但处理数组
如果非要用find(),记得它返回的是数组,需要取第一个元素,还要判断数组是否为空:
app.post("/login", (req, res) => { const userEmail = req.body.loginEmail; const userPass = req.body.loginPassword; User.find({ email: userEmail }, (err, users) => { // 处理错误或无匹配用户的情况 if (err || users.length === 0) { return res.send(err || "该邮箱未注册"); } // 取出数组中的第一个用户对象 const user = users[0]; console.log("database email: " + user.email) bcrypt.compare(userPass, user.password, (err, result) => { if (err) { return res.send(err); } console.log("database password: " + user.password); if (result) { user.isVerified ? res.redirect("/success") : res.send("您的账户未验证,请查看邮箱以访问账户。"); } else { res.send("密码错误"); } }); }); });
额外提醒:别混用bcrypt和明文对比
你的代码里同时写了bcrypt.compare和userPass === user.password,这是错误的!正常情况下数据库存的是bcrypt哈希后的密码,不是明文,直接对比userPass === user.password永远会失败,完全没必要留着,只用bcrypt.compare返回的result判断就好。
内容的提问来源于stack exchange,提问作者RyanHaraki
相关产品推荐
相关产品推荐

