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
相关产品推荐
相关产品推荐

