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

使用GraphQL、ApolloServer、MongoDB、Express时,数据库已创建会话记录但浏览器无法设置Cookie问题求助

解决会话Cookie无法设置及me查询返回null的问题

嘿,我看了你的代码和问题描述,核心问题出在Cookie的配置上,还有几个小细节需要调整,咱们一步步来解决:

1. 修复Cookie的secure配置

你在session里把cookie.secure设成了true,但这个选项的作用是只有在HTTPS协议下浏览器才会保存这个Cookie。而你本地开发用的是普通HTTP(端口4000,没开HTTPS),所以浏览器直接拒绝存储这个Cookie了——这就是为什么MongoDB里有会话数据,但前端拿不到Cookie,me查询返回null的关键原因。

把secure改成用你已经定义好的__prod__常量来控制,这样生产环境(HTTPS)自动开启,开发环境(HTTP)自动关闭:

cookie: {
  maxAge: 1000 * 60 * 60 * 24 * 30, // 顺便修正下maxAge,之前的数值算出来是几十年,这里改成30天(毫秒单位)
  secure: __prod__, // 只在生产环境启用secure
  httpOnly: true,
  sameSite: 'lax'
}

2. 在Apollo Studio中开启Cookie携带

你用的是Apollo Studio来测试请求,默认情况下它不会自动携带Cookie。发送请求前,一定要勾选请求面板底部的**"Include cookies"**选项,这样请求才会把Cookie传给你的服务器,req.session里才能拿到userId。

3. 确认CORS配置的适配性

你的CORS origin设为https://studio.apollographql.com是对的,但如果之后你用本地前端项目(比如React/Vue)测试,记得把origin改成前端的地址(比如http://localhost:3000),同时前端发送请求时也要设置credentials: true。

4. 验证Session存储的数据库一致性

虽然你说MongoDB里已经有会话数据,但还是确认下MongoStore.create的mongoUrl和你MikroORM配置的数据库地址是同一个,避免出现会话存在A库,读取却从B库读的情况。

5. 类型定义的小优化

你的MyContext里req.session的类型可以更严谨些,登录后session肯定是存在的,把session?:改成session::

export interface MyContext {
  em: EntityManager<any> & EntityManager<IDatabaseDriver<Connection>>;
  req: Request & { session: Session & { userId?: number } };
  res: Response;
};

调整完这些之后,重启服务器,重新执行登录mutation,然后勾选Include cookies再跑me查询,应该就能正常返回用户数据啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:09:10