点进后台,地址栏在 /login 和 /dashboard 之间来回跳,最后控制台报 Maximum call stack size exceeded,整页全白。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
router.beforeEach((to) => {
if (WHITE.includes(to.name)) return true
if (!token) return { name: 'login', query: { from: to.fullPath } }
})
守卫里判断未登录就跳到登录页,登录页也注册了同一个全局守卫,条件没排除它,又被判定未登录再跳一次。每次跳转都重新进守卫,调用栈很快就满了。这一点先确认清楚,后面就不用反复试。
「路由守卫死循环」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
具体做法是,在守卫开头放行白名单,登录页和错误页直接 return true;用 return 代替 next,新版 router 里重复调用会直接报错;跳转前判断目标地址是不是已经在跳的那个,相同就别再跳。
改完照着核一遍,未登录访问后台直接落到登录页,地址栏不再来回跳。
