MongoDB获取已登录用户信息并渲染至HTML页面失败问题排查
问题分析与修复方案
问题1:Session存储的邮箱字段不匹配
登录逻辑中,数据库查询用户用的是userEmail字段,但存入Session时误写为existingUser.email——而数据库里用户的邮箱字段实际是userEmail,这会导致Session里的req.session.user.email值为undefined,后续查询数据库时根本找不到对应用户。
问题2:变量作用域错误导致渲染无数据
/billing路由的else块内声明了const user,该变量仅在块级作用域内有效,外部的res.render无法访问到它,最终传递给模板的user是未定义状态。
修复后的代码
修正登录路由的Session存储部分
router.post("/login", async function (req, res) { const userData = req.body; const enteredEmail = userData.userEmail; const enteredUserName = userData.userName; const enteredPassword = userData.password; let existingUser = await db .getDb() .collection("users") .findOne({ userEmail: enteredEmail }); if (!existingUser) { req.session.userInputData = { hasError: true, message: "user does not exist", userEmail: enteredEmail, password: enteredPassword, }; req.session.save(function () { res.redirect("/login"); }); return; } const passwordsAreEqual = await bcrypt.compare( enteredPassword, existingUser.password ); if (!passwordsAreEqual) { req.session.userInputData = { hasError: true, message: "Invalid input - please check your credentials", userEmail: enteredEmail, password: enteredPassword, }; req.session.save(function () { res.redirect("/login"); }); return; } // 修正:使用数据库中实际的邮箱字段userEmail req.session.user = { id: existingUser._id, email: existingUser.userEmail }; req.session.isAuthenticated = true; req.session.save(function () { res.redirect("/billing"); }); });
修正/billing路由的作用域问题
router.get("/billing", async function (req, res) { if (!req.session.isAuthenticated) { return res.status(401).render("401"); } // 将变量声明移到块外,确保res.render能访问到 const user = await db .getDb() .collection("users") .findOne({ userEmail: req.session.user.email }); // 额外优化:处理Session数据异常导致用户不存在的情况 if (!user) { req.session.destroy(); return res.status(401).render("401"); } res.render("billing", { user: user }); });
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

