POST登录后session存入MongoDB正常,后续请求session为undefined如何解决
TypeScript Session 声明相关
你写的express-session类型扩展是足够的,仅需注意两点:
- 该声明需要是
.d.ts类型文件,且放在tsconfig.json的include配置覆盖的目录下,确保TS编译时可以读取到 - 不需要写
export default SessionData,仅保留模块声明的部分即可,不会影响类型识别。
新建Session问题排查与解决
你遇到的无法复用已有Session的核心原因是后续GET请求没有携带Session Cookie,后端无法匹配到已存储的Session,所以生成了新的空Session,按以下步骤修复即可:
1. 补全所有后端请求的凭证配置
你只在登录的POST请求中添加了withCredentials: true,跳转后请求getHome接口的GET请求没有配置该属性,浏览器默认不会跨域携带Cookie,导致后端认不到用户身份。
可以直接配置Axios全局生效:
// 前端全局配置,放在所有Axios请求之前 axios.defaults.withCredentials = true
如果不想全局配置,就给每个发往3000端口的请求单独加withCredentials: true参数。
2. 补全Session Cookie配置
你当前的Cookie配置缺少显式的域、路径等属性,容易出现浏览器不识别Cookie的问题,修改session配置的cookie部分:
cookie: { httpOnly: true, // 建议开启,防止XSS攻击窃取Cookie maxAge: 36000000, sameSite: 'lax', // 本地开发用lax即可,跨生产域需要设为none且secure设为true secure: false, // 本地http环境设为false,上线https环境改为true domain: 'localhost', path: '/' }
3. 补充Session保存错误判断
你当前的登录接口中没有处理session.save的错误,可能出现session实际没有存储成功,但前端收到成功响应的情况,修改登录逻辑:
req.session.user = user; req.session.isLoggedIn = true; return req.session.save((err) => { // 新增错误判断 if(err) { console.log('session保存失败', err); return res.status(500).json({success: false, message: '登录失败'}); } if (req.session.isLoggedIn) { res.status(201).json({ success: true, message: "You are logged in !", url: "/client/home.html", session: req.session }) } })
验证方法
如果修改后还有问题,可以按以下顺序排查:
- 登录接口响应后,检查浏览器控制台的Application->Cookie->localhost:3000下有没有
connect.sid这个Cookie - 发起GET请求时,检查请求头的
Cookie字段有没有携带connect.sid的值 - 对比MongoDB中存储的session集合的
_id字段,和connect.sid的值(去掉签名后缀)是否一致
内容的提问来源于stack exchange,提问作者misugi
相关产品推荐
相关产品推荐

