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

Node.js中req.session被其他用户覆盖的问题及解决方法咨询

解决Node.js中req.session被并发请求覆盖的问题

问题根源

你代码里的sess和session_details没有用var/let/const声明,属于全局变量。Node.js是单线程事件循环模型,并发请求会共享全局变量,后到达的请求会覆盖前面请求的变量值,就出现了用户A的操作使用用户B的session数据的情况。

修复方案

1. 使用块级作用域变量

在每个路由处理函数内部,用const或let声明sess和session_details,确保每个请求的变量都是独立的,不会互相干扰:

app.get('/user/dashboard', function (req, res) {
  const sess = req.session;
  const session_details = getSessionData(sess); // 从数据库获取会话关联数据

  const locals = {
    title: 'Dashboard',
    session: session_details,
  }
  res.render('pages/dashboard', locals);
});

app.post('/user/insert-profile', function (req, res) {
  const sess = req.session;
  const session_details = getSessionData(sess); // 从数据库获取会话关联数据
  
  // 执行插入/更新数据库的逻辑(基于session_details中的用户ID)

  res.end('Insert successfully');
});

2. 强化会话验证逻辑

  • 确保getSessionData严格依赖当前session中的用户标识(比如_id)去查询数据库,不要依赖任何外部变量,避免逻辑漏洞。
  • 新增身份验证中间件,提前拦截未登录的请求,同时确保session有效性:
// 身份验证中间件
const authMiddleware = (req, res, next) => {
  if (!req.session?.user?._id) {
    return res.status(401).redirect('/login');
  }
  next();
};

// 给需要权限的路由挂载中间件
app.get('/user/dashboard', authMiddleware, function (req, res) {
  // 原有业务逻辑
});

app.post('/user/insert-profile', authMiddleware, function (req, res) {
  // 原有业务逻辑
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:25:18