Express-session:每次请求时Cookie过期时间未重置问题求助
你设置了resave: false,这个配置的作用是只有当会话数据发生修改时,才会将会话重新保存到存储中。而express-session默认不会在每次请求时自动重置Cookie的过期时间,除非满足两个条件之一:
- 会话数据被修改(触发resave逻辑)
- 显式开启了
rolling: true配置
你的场景中,除了登录请求会修改request.session.User,后续的authenticated请求只是读取会话数据,没有修改任何内容,所以resave: false会跳过会话保存,Cookie的过期时间自然不会被重置。
另外你的authenticated接口存在一个bug:没有通过@Req()装饰器注入request对象,直接使用request会导致报错,这也是需要修复的点。
针对Cookie过期时间不重置的问题,有两种可行方案:
方案一:开启rolling配置
修改session中间件的配置,添加rolling: true,这样每次请求都会重新设置Cookie,自动重置过期时间:
app.use( session({ secret: process.env.COOKIE_SECRET, resave: false, saveUninitialized: true, cookie: { maxAge: 60000 }, // 1分钟 rolling: true // 新增:每次请求重置Cookie过期时间 }), );
注意:即使resave: false,rolling: true也会在每次响应时发送新的Cookie,重置maxAge,不管会话数据有没有变化。
方案二:手动修改会话触发保存
如果不想每次请求都发送Cookie,可以在需要延长会话的请求中,手动修改会话的某个属性(比如记录最后活跃时间),触发会话保存逻辑,从而重置Cookie过期时间:
比如在authenticated接口中修改:
@Get('authenticated') authenticated(@Req() request) { // 修复:注入request对象 if (request.session.User) { // 手动修改会话,触发保存,重置Cookie过期时间 request.session.lastActive = Date.now(); return new HttpException('OK', HttpStatus.OK); } return new HttpException('No session', HttpStatus.UNAUTHORIZED); }
这种方式只有当会话存在时才会修改会话,触发resave逻辑,适合需要更精细控制的场景。
额外修复:接口的request注入问题
你的authenticated接口没有注入request对象,必须添加@Req()装饰器,否则会出现request is not defined的错误,修复后的代码如上所示。
内容的提问来源于stack exchange,提问作者hunglt.ee

