You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:35