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

Express登录后req.session在/getevents等接口始终返回undefined求助

问题排查与解决

给你梳理几个关键问题,按顺序排查即可:

1. 补全Session配置的Cookie参数

你的express-session配置缺少Cookie相关参数,跨域场景下(前后端不同端口属于跨域)浏览器会拒绝携带Cookie,导致后端拿不到Session。修改Session配置:

app.use(
  session({
    key: "userId",
    secret: "123123123",
    resave: false, // 改为false,避免无意义的Session重写
    saveUninitialized: false, // 改为false,仅当Session有数据时才存储
    cookie: {
      secure: false, // 本地开发用HTTP,设为false;生产环境HTTPS需改为true
      sameSite: "lax", // 允许跨域请求携带Cookie
      maxAge: 24 * 60 * 60 * 1000 // 设置Cookie有效期为1天
    }
  })
);

2. 前端请求必须开启Credentials

不管用Axios还是Fetch,请求后端接口时必须明确携带Cookie凭证,否则浏览器不会主动传递:

  • Axios示例:
axios.get('http://localhost:你的后端端口/getevents', { withCredentials: true })
  • Fetch示例:
fetch('http://localhost:你的后端端口/getevents', { credentials: 'include' })

3. 确认Session在登录时已正确设置

在登录接口的密码验证成功回调里,添加打印语句确认Session是否被正确赋值:

if (response) {
  req.session.userId = result[0].id;
  console.log(req.session); // 查看控制台是否存在userId字段
  res.send(result);
}

如果这里能正常打印出userId,说明登录环节没问题,问题出在后续请求的Cookie携带上;如果打印不出来,检查Session中间件是否在所有路由之前加载(你的代码顺序是对的,可再确认)。

4. 修复SQL注入漏洞(顺带优化)

你的/addevent接口用字符串拼接SQL,存在严重注入风险,改成参数化查询:

app.post("/addevent", (req, res) => {
  const { title, date } = req.body;
  const userId = req.session.userId;
  db.query(
    "INSERT INTO event (title, date, user_id) VALUES (?, ?, ?)",
    [title, date, userId],
    (err, result) => {
      if (err) {
        console.log(err);
        res.status(500).send({ error: err.message });
      } else {
        res.send(result);
      }
    }
  );
});

5. 内存存储的局限性(开发阶段可忽略,生产必须替换)

默认express-session用内存存储Session,服务器重启后所有Session会丢失,高并发场景下也有性能问题。生产环境建议替换为express-mysql-session或Redis这类持久化存储方案。

注:你描述里提到的req.session.user应该是笔误,代码中实际存储的是req.session.userId,排查时注意对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:40:36