express-session+Apollo技术栈刷新后session查询失效问题求助
排查方案
1. 检查Apollo Client请求配置
- 客户端默认不会自动携带Cookie,需在创建
ApolloClient时明确配置credentials:const client = new ApolloClient({ uri: '/graphql', credentials: 'include', // 跨域场景用这个,同域也可兼容 cache: new InMemoryCache(), }); - 若单独配置了
HttpLink,同样要加上该选项:const link = new HttpLink({ uri: '/graphql', credentials: 'include', });
2. 校验express-session配置
- 重点检查
cookie相关参数:- 开发环境(HTTP)下
secure必须设为false,否则浏览器会拒绝发送Cookie;生产环境(HTTPS)设为true sameSite若设为Strict,跨域场景可能引发问题,开发阶段可先设为Lax或None(设None需配合secure: true)
示例配置:
app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false, store: new MongoDBStore({ uri: 'mongodb://localhost:27017/sessions' }), cookie: { maxAge: 1000 * 60 * 60 * 24, httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: process.env.NODE_ENV === 'production' ? 'Lax' : 'None', }, })); - 开发环境(HTTP)下
- 确认
saveUninitialized设为false,避免创建空session干扰验证逻辑
3. 检查ItIsMe查询的Resolver与上下文配置
- 确保Resolver从
req.session正确取用户信息:const resolvers = { Query: { ItIsMe: (_, __, { req }) => { return req.session.user || null; }, }, }; - 验证Apollo Server上下文是否传递了
req对象:const server = new ApolloServer({ typeDefs, resolvers, context: ({ req }) => ({ req }), });
4. 跨域场景下的CORS配置校验
- 若前后端域名不同,express需配置CORS允许携带凭证:
const cors = require('cors'); app.use(cors({ origin: 'http://your-frontend-domain.com', // 必须指定具体前端域名,不能用* credentials: true, }));
5. 浏览器请求Cookie验证
- 打开浏览器开发者工具(F12)→ Network标签,刷新页面后查看GraphQL请求的Request Headers:
- 确认是否存在
Cookie字段,且值与登录后的session ID一致 - 若无
Cookie字段,回到第一步检查客户端配置;若有,后端需打印req.session.user日志,确认session存储(connect-mongodb-session连接、数据库session文档)是否正常
- 确认是否存在
内容的提问来源于stack exchange,提问作者M G
相关产品推荐
相关产品推荐

