设置Redis存储的cookie后Apollo Client无法连接服务端问题求助
问题排查步骤
第一步:定位请求卡住的层级
- 打开浏览器开发者工具的「网络」面板,找到pending状态的GraphQL请求,查看请求头里的Cookie字段是否正常携带,有没有出现Cookie值过大、格式异常的问题
- 查看该请求的「计时」标签,确认卡住的阶段是在等待服务器响应阶段还是本地连接阶段,排除客户端本身拦截问题
- 直接用Postman/ApiFox手动携带登录后的Cookie调用
http://localhost:5000/graphql接口,看是否同样无响应,如果也卡住说明问题出在服务端,和客户端配置无关
第二步:排查服务端中间件执行顺序问题
你当前的代码里session中间件注册在Apollo Server挂载之前,逻辑是对的,首先要检查有没有漏加必要的express基础中间件:
- 确认是否加了
express.json()中间件,缺失该中间件会导致POST请求的body无法被解析,服务端会一直等待请求数据传输完成,最终卡住。可以在注册session中间件之前加上:
app.use(express.json())
第三步:排查Redis连接/会话存储异常
- 查看服务端控制台有没有报错日志,如果Redis连接异常,
connect-redis获取会话时会卡住,不会返回响应 - 本地启动redis-cli,执行
keys rds:*查看是否有对应登录用户的session存储记录,手动删除该session记录后再发请求,看是否恢复正常 - 临时注释掉session中间件配置,把Apollo Server的context改为不需要会话的逻辑,测试请求是否正常,确认是否是会话模块导致的问题
第四步:排查CORS与跨域Cookie配置冲突
- 你当前的
sameSite设置为lax,本地开发环境http协议下是没问题的,可以临时把sameSite改为none,同时把secure改为false测试,排除SameSite策略拦截导致的请求异常 - 检查登录逻辑里设置Cookie的代码,有没有重复设置同名Cookie、或者Cookie值包含特殊字符导致解析失败的情况
第五步:排查Apollo Server上下文与Resolver逻辑异常
- 在Apollo Server的context函数里加一行打印日志,看请求是否能走到context逻辑:
context: ({ req, res }: any) => { console.log('收到请求,sessionId:', req.sessionID) return { req, res } },
如果日志没有打印,说明请求在到达Apollo Server之前就被前面的中间件卡住了,重点排查session、CORS等中间件
如果日志能打印,说明是后续的Resolver执行卡住,检查对应Resolver里有没有拿session里的用户信息查数据库时死锁、或者SQL语句执行超时的情况
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

