页面重载后req.session.cookies和req.session.user丢失问题(Nextjs/Expressjs)
排查与解决步骤
- 先确认中间件重复触发的原因
Next.js 12及以上版本默认中间件会响应所有进站请求,包括页面、静态资源、favicon、内部接口等,你看到的第二次调用大概率是页面加载过程中触发的其他资源请求,并非同一次页面请求的重复执行。你可以在中间件中打印req.url确认两次请求的具体路径,快速定位触发源。
你可以通过配置matcher规则,限制中间件仅在目标路由触发,排除不需要的路径:
// 在middleware.ts同文件下添加 export const config = { matcher: ['/((?!_next/static|_next/image|favicon.ico|api).*)'] };
配置完成后再观察日志是否还存在多次调用的情况。
- 排查session丢失的根因
- 校验cookie配置规则:升级Node/Next.js版本后,框架默认的安全策略会收紧,检查session.ts中的cookie配置项,
domain、path、sameSite、secure属性是否匹配当前站点的访问地址,如果是本地开发环境不要强制开启secure: true,否则http协议下cookie不会被携带。 - 检查中间件的响应处理逻辑:如果你在中间件中做了重定向、自定义返回响应的操作,需要确保session库自动生成的
Set-Cookie响应头被正确传递,不能直接覆盖响应头导致session cookie没有被写入客户端,后续请求自然无法解析出session数据。 - 确认session依赖库的版本兼容性:你使用的session管理库(如next-session、express-session)需要兼容你当前的Node.js和Next.js版本,部分低版本的session库没有适配Node 18+的fetch API cookie规则、Next.js的App Router新特性,会导致cookie解析失败出现空对象的情况。
- 快速验证方案
你可以先回退到升级前的Node和Next.js版本,确认问题是否复现,如果回退后恢复正常,基本可以确定是版本兼容或者配置规则变更导致的问题,再针对性修改配置即可。
内容的提问来源于stack exchange,提问作者Roman Nozhenko
相关产品推荐
相关产品推荐

