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

React使用Fetch发请求时express-session每次生成新会话如何解决

问题修复方案
  • 调整中间件加载顺序
    必须先加载cors中间件,再加载session中间件,否则跨域凭证配置未生效时session就会提前初始化,导致每次请求生成新会话:
    // 正确加载顺序
    app.use(cors(corsOptions))
    app.use(session(/* 你的session配置 */))
    
  • 补全session配置的cookie属性
    你当前的session配置没有显式设置cookie属性,本地开发环境补充如下配置即可:
    app.use(session({
      secret: 'sec12',
      resave: false,
      saveUninitialized: false,
      // 新增cookie配置
      cookie: {
        httpOnly: true,
        secure: false, // 本地http环境设为false,生产环境用https时改为true
        sameSite: 'lax',
        maxAge: 9 * 60 * 60 * 1000 // 和MongoStore的ttl保持一致
      },
      store: MongoStore.create({
          mongoUrl: keys.mongodb.dbURI,
          autoRemove: 'native',
          ttl: 9 * 60 * 60,
          mongoOptions: {
              useNewUrlParser: true, 
              useUnifiedTopology: true
          }
        })
    }));
    
    注意saveUninitialized设为false时,只有首次请求中修改了session的值(比如req.session.user = 用户信息),session才会被持久化到存储中,未修改的会话不会被保存,下次请求自然识别为新会话。
    生产环境如果前后端属于跨站场景,需要将cookie的sameSite改为none,同时secure设为true,且后端必须走HTTPS协议。
  • 调整cors配置的预检参数
    将preflightContinue改为false,让cors中间件自动处理OPTIONS预检请求,避免预检请求触发session初始化:
    var corsOptions = {
      origin: 'http://localhost:3000',
      methods: ['GET', 'POST'],
      optionsSuccessStatus: 200,
      credentials:true,
      preflightContinue: false, // 修改为false
      allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept']
    }
    
  • 检查前端所有请求配置
    确保所有GET/POST请求的fetch参数都显式设置了credentials: 'include',漏加该参数的请求不会携带cookie,后端会识别为新访客生成新会话。

内容的提问来源于stack exchange,提问作者Jomar Tinga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 15:57:02