现象
在iPhone Safari浏览器非隐私模式下,首次直接打开FastGPT免登录分享链接(路径格式为/chat/share?shareId=xxx)时,页面会显示报错提示“凭证已过期,请重新登录”。刷新页面后报错消失,可正常使用该链接。该免登录分享链接在电脑Chrome浏览器中首次打开可正常加载。
可能原因
该问题属于zustand hydration时序问题:1. share.tsx中的localUId存储在使用zustand persist + localStorage的useShareChatStore中;2. 首次访问时,zustand需要从localStorage中hydrate数据,此时loaded状态为false,localUId值为undefined;3. ChatContextProvider中的useScrollPagination在组件挂载时会立即发起请求(配置项manual: false);4. 此时请求携带的outLinkUid参数为空,导致服务端返回403错误;5. 前端将该403错误码识别为TOKEN_ERROR_CODE,从而显示对应报错文本。
排查步骤
- 确认访问环境为iPhone Safari浏览器非隐私模式,且使用的是FastGPT应用的免登录分享链接;
- 首次打开该链接,观察是否出现“凭证已过期,请重新登录”报错,刷新页面后是否恢复正常;
- 查看前端代码中
useShareChatStore的hydrate逻辑,确认loaded状态与localUId的取值时机; - 核对
ChatContextProvider中useScrollPagination的请求触发条件,确认是否在localUId未加载完成时发起了请求; - 检查前端对服务端403错误的处理逻辑,确认是否将其关联至
TOKEN_ERROR_CODE。
解决与验证
解决该问题的核心是调整zustand hydration的时序,确保localUId加载完成(即loaded状态为true)后,再触发useScrollPagination的请求。验证步骤如下:
- 部署修复了时序问题的代码版本;
- 使用iPhone Safari浏览器非隐私模式首次打开免登录分享链接,确认无报错且可正常使用;
- 重复多次测试,确认问题不再复现;
- 对比电脑Chrome浏览器的访问情况,确认功能不受影响。
来源:https://github.com/labring/FastGPT/issues/6335