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

Express会话参数在二次HTTP请求后丢失问题求助

会话UID丢失问题的原因与修复

核心问题:会话未被持久化

你在POST /login接口里设置了req.session.uid,但没有发送响应结束请求。express-session的机制是在响应结束时,才会把会话的修改同步到存储介质中。请求一直挂着的话,会话更新根本没被保存,后续请求自然读不到uid。

额外需要修复的边界问题

  1. 没处理数据库查询的错误,万一查询出错,请求会一直挂起
  2. 没处理邮箱不存在的情况(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:31:00