Express会话参数在二次HTTP请求后丢失问题求助
会话UID丢失问题的原因与修复
核心问题:会话未被持久化
你在POST /login接口里设置了req.session.uid,但没有发送响应结束请求。express-session的机制是在响应结束时,才会把会话的修改同步到存储介质中。请求一直挂着的话,会话更新根本没被保存,后续请求自然读不到uid。
额外需要修复的边界问题
- 没处理数据库查询的错误,万一查询出错,请求会一直挂起
- 没处理邮箱不存在的情况(
rows.length !== 1),同样会导致请求挂起
修复后的代码
app.use(session({ secret: "rolling-communication", rolling: true, cookie: { maxAge: 1000 * 60, } })); auth.post("/login", (req, res) => { const clientReq = req.body; const loginQuery = 'SELECT uid as UID, password as PWD from Users where email = ?'; pool.query(loginQuery, clientReq.email, (err, rows) => { // 处理数据库查询错误 if (err) { console.error(err); return res.status(500).send("服务器内部错误"); } if (rows.length === 1) { req.session.uid = rows[0].UID; console.log(req.session); // 发送响应,触发会话持久化 return res.send({ success: true, uid: rows[0].UID }); } else { // 处理邮箱不存在的场景 return res.status(401).send("邮箱不存在"); } }); }); app.get("/test", (req, res) => { console.log(req.session); // 现在能正常读到uid了 res.end(); });
补充说明
- 只要修改了会话数据,必须通过
res.send()/res.end()等方法结束请求,否则会话更新不会被保存 - 你的
rolling: true配置是正常的,它只会在每次请求时刷新cookie的过期时间,不会导致会话丢失 - 如果是开发环境用默认的内存存储,服务器重启后会话会丢失;生产环境建议用Redis这类持久化存储方案
内容的提问来源于stack exchange,提问作者GabrijelOkorn
相关产品推荐
相关产品推荐

