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

GraphQL Explorer搭配Express Sessions使用时session无法保存问题

问题修复方案

1. 等待session异步保存完成再返回响应

express-session的save操作是异步执行的,你在赋值req.session.userId后直接返回响应,会出现在session写入数据库前请求就已结束的情况,导致session未正常持久化。修改登录Mutation代码,手动等待session保存完成:

@Mutation(() => User, { nullable: true })
public async login(
    @Arg("username") username: string,
    @Arg("password") password: string,
    @Ctx() { req }: Context
) {
    const user = await UserModel.findOne(
        username.includes("@") ? { email: username } : { username }
    );
    if (!user) return;

    if (!(await verify(user.password, password))) return;

    req.session.userId = user._id;
    // 新增等待session保存逻辑
    await new Promise((resolve, reject) => {
      req.session.save(err => err ? reject(err) : resolve(null))
    })

    return user;
}

2. 移除重复的CORS配置

你同时配置了全局express CORS中间件和Apollo服务的CORS参数,重复配置会出现规则覆盖冲突。二选一共用一套配置即可,推荐保留Apollo的CORS配置,删除全局CORS中间件:

// 删除这段全局CORS配置
// app.use(
//     cors({
//         origin: [__clientUrl__, "https://studio.apollographql.com"],
//         credentials: true
//     })
// );

3. 适配开发环境的Cookie规则

如果是本地开发阶段,用线上Apollo Studio(HTTPS协议)调用本地HTTP服务时,需注意浏览器跨站Cookie规则:

  • 开发环境下sameSite设为lax,不要设为none(none必须搭配secure: true使用,本地HTTP服务不满足)
  • 确认process.env.SESSION_SECRET已正确加载,不存在空值问题

4. 验证MongoStore配置有效性

可在MongoStore配置中添加调试相关参数,确认session能正常写入数据库:

store: MongoStore.create({
    mongoUrl: process.env.MONGO_URI,
    dbName: "example",
    autoRemove: 'native',
    touchAfter: 24 * 3600 // 24小时内同一session只更新一次,减少数据库操作
})

配置完成后可直接查看MongoDB的sessions集合,确认登录后有对应session记录生成。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:39:04