刷新页面后第一个接口请求头里没有 Authorization,返回 401,用户被踢到登录页。再刷新一次又正常,复现率大约三成。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,store 在模块顶层创建,读取 localStorage 的代码写在另一个模块,加载顺序靠 import 决定。请求在 hydration 完成前就发出去了。

「状态初始化顺序」这类改动最怕改一半,回滚脚本先准备好,再动生产。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

const token = localStorage.getItem('token');
const useStore = create({ token, user: null });
// 或在 onRehydrateStorage 完成后再渲染

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,把读取持久化的动作放进 store 创建过程 同步完成;请求层统一从 store 取 token 不要在模块顶层缓存;路由守卫等 hydration 标记为 true 再放行;强制刷新二十次 确认不再出现 401。

最后用这个标准收尾,连续强制刷新二十次,首个请求都带 Authorization,401 不再出现。

作者 9823189