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

如何在HTML文件中显示Node.js路由中的session.userid变量?

解决前端无法获取后端session.userid的问题

问题根源

后端的req.session是服务器端专属的会话存储,前端浏览器根本无法直接访问这个变量,所以你直接写session.userid会报错或者拿到undefined。

三种可行解决方案

方案一:用模板引擎渲染页面(推荐)

用EJS、Pug这类模板引擎把后端的session数据直接注入到HTML中:

  1. 安装EJS:
npm install ejs
  1. 在Express里配置模板引擎:
app.set('view engine', 'ejs');
// 把admin.html改名为admin.ejs,放到views目录下(默认路径)
  1. 修改登录路由,替换res.sendFile为渲染模板:
// 原代码res.sendFile(...)替换成:
res.render('admin', { username: req.session.userid });
  1. 在admin.ejs里直接使用变量:
<!-- 直接在HTML中显示 -->
<div id="username"><%= username %></div>

<!-- 或者在脚本中使用 -->
<script>
const username = '<%= username %>';
document.getElementById("username").innerHTML = username;
</script>

方案二:手动替换HTML内容(不用模板引擎)

如果不想改模板引擎,可以读取HTML文件后替换占位符:

  1. 修改登录路由:
const fs = require('fs');
const adminHtmlPath = path.resolve(__dirname, '../public/admin.html');

fs.readFile(adminHtmlPath, 'utf8', (err, htmlContent) => {
  if (err) {
    console.error(err);
    return res.status(500).send('服务器出错');
  }
  // 把HTML里的{{username}}占位符替换成实际用户名
  const renderedHtml = htmlContent.replace('{{username}}', req.session.userid);
  res.send(renderedHtml);
});
  1. 在admin.html里加占位符:
<div id="username">{{username}}</div>

方案三:前端AJAX请求用户信息

前端主动发请求到后端接口获取用户名:

  1. 后端新增接口:
router.get('/api/current-user', (req, res) => {
  if (req.session.userid) {
    res.json({ username: req.session.userid });
  } else {
    res.status(401).json({ msg: '未登录' });
  }
});
  1. 修改前端脚本:
<script>
function setUsername() {
  fetch('/api/current-user')
    .then(res => res.json())
    .then(data => {
      document.getElementById("username").innerHTML = data.username;
    })
    .catch(err => console.log(err));
}
// 页面加载时自动调用
window.onload = setUsername;
</script>

额外提示:修复登录逻辑的bug

你现在的登录逻辑有问题:分别查询用户名和密码,会导致不同用户的密码匹配时误判。正确做法是先查用户,再对比密码(注意密码不能明文存储,要用bcrypt加密):

const checkUser = await user.findOne({ name: name });
// 假设密码存在checkUser.password里,且是bcrypt加密后的
if (checkUser && await bcrypt.compare(pass, checkUser.password)) {
  req.session.userid = req.body.name;
  // 后续登录成功逻辑
} else {
  res.send('用户未注册或密码错误');
}

内容的提问来源于stack exchange,提问作者coldstone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:00:27