故障排查GitHub issue3 分钟阅读排错/错误码

解决iPhone Safari首次打开FastGPT免登录分享链接报错问题

在iPhone Safari浏览器非隐私模式下,首次直接打开FastGPT免登录分享链接(路径格式为/chat/share?shareId=xxx)时,页面会显示报错提示“凭证已过期,请重新登录”。刷新页面后报错消失,可正常使用该链接。该免登录分享链接在电脑Chrome浏览器中首次打开可正常加载。

现象

在iPhone Safari浏览器非隐私模式下,首次直接打开FastGPT免登录分享链接(路径格式为/chat/share?shareId=xxx)时,页面会显示报错提示“凭证已过期,请重新登录”。刷新页面后报错消失,可正常使用该链接。该免登录分享链接在电脑Chrome浏览器中首次打开可正常加载。

可能原因

该问题属于zustand hydration时序问题:1. share.tsx中的localUId存储在使用zustand persist + localStorageuseShareChatStore中;2. 首次访问时,zustand需要从localStorage中hydrate数据,此时loaded状态为falselocalUId值为undefined;3. ChatContextProvider中的useScrollPagination在组件挂载时会立即发起请求(配置项manual: false);4. 此时请求携带的outLinkUid参数为空,导致服务端返回403错误;5. 前端将该403错误码识别为TOKEN_ERROR_CODE,从而显示对应报错文本。

排查步骤

  1. 确认访问环境为iPhone Safari浏览器非隐私模式,且使用的是FastGPT应用的免登录分享链接;
  2. 首次打开该链接,观察是否出现“凭证已过期,请重新登录”报错,刷新页面后是否恢复正常;
  3. 查看前端代码中useShareChatStore的hydrate逻辑,确认loaded状态与localUId的取值时机;
  4. 核对ChatContextProvideruseScrollPagination的请求触发条件,确认是否在localUId未加载完成时发起了请求;
  5. 检查前端对服务端403错误的处理逻辑,确认是否将其关联至TOKEN_ERROR_CODE

解决与验证

解决该问题的核心是调整zustand hydration的时序,确保localUId加载完成(即loaded状态为true)后,再触发useScrollPagination的请求。验证步骤如下:

  1. 部署修复了时序问题的代码版本;
  2. 使用iPhone Safari浏览器非隐私模式首次打开免登录分享链接,确认无报错且可正常使用;
  3. 重复多次测试,确认问题不再复现;
  4. 对比电脑Chrome浏览器的访问情况,确认功能不受影响。

来源:https://github.com/labring/FastGPT/issues/6335