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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:17