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
相关产品推荐
相关产品推荐

