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

