带有Firebase和FirebaseUI的Nuxt中间件:错误:从"/“任何事”;至/“登录”;通过导航装置

带有Firebase和FirebaseUI的Nuxt中间件:错误:从"/“任何事”;至/“登录”;通过导航装置,firebase,vue.js,nuxt.js,vuex,firebaseui,Firebase,Vue.js,Nuxt.js,Vuex,Firebaseui,Nuxt SSR应用程序使用FirebaseUI处理身份验证流。登录和注销都可以完美地工作。当我添加中间件以检查身份验证状态并在未登录时重定向时,我会出现以下错误: 错误:通过导航保护从“/列出备忘单”转到“/登录”时重定向 中间件/auth.js 导出默认函数({store,redirect}){ //如果用户未通过身份验证 如果(!store.state.user){ 返回重定向(“/login”) } } 我在应用程序中找不到任何其他重定向 我已经挖掘和尝试了几个小时。我发现的其他出现此

Nuxt SSR应用程序使用FirebaseUI处理身份验证流。登录和注销都可以完美地工作。当我添加中间件以检查身份验证状态并在未登录时重定向时,我会出现以下错误:

错误:通过导航保护从“/列出备忘单”转到“/登录”时重定向

中间件/auth.js

导出默认函数({store,redirect}){
//如果用户未通过身份验证
如果(!store.state.user){
返回重定向(“/login”)
}
}
我在应用程序中找不到任何其他重定向


我已经挖掘和尝试了几个小时。我发现的其他出现此错误的人没有使用Nuxt,并且这些解决方案都不起作用。

因为有赏金,所以不能将其标记为重复,因此后续是我的答案的副本


tldr:
vm.$router.push(route)
是一个承诺,需要
.catch(e=>gotcatch(e))
错误。


这将在下一个@4中更改


Currently@3不区分错误是
导航失败
还是
常规错误

vm.$router.push(to)
之后的原始预期路由应该是
to
。因此,一旦发生重定向,就可以看到一些失败消息在修补路由器之前将路由器推送为承诺该错误被默默忽略。 当前的解决方案是在每次推送时反模式一个
.catch(…)
,或者预测设计中的变化,并将其包装以暴露失败

未来的计划是将这些信息转化为结果:

  let failure = await this.$router.push(to);
  if(failure.type == NavigationFailureType[type]){}
  else{}

Imo此错误仅由以下人员处理:

hook(route, current, (to: any) => { ... abort(createNavigationRedirectedError(current, route)) ...}
所以基本上,如果
to
包含重定向,这是一个错误,这相当于使用
vm.$router.push
进入一个防护

要忽略未处理的错误行为,可以传递一个空的onComplete(在将来的版本中中断):

或者用
试试。。捕获

try {

  await this.$router.push("/")
} catch {

}
这就防止了错误的发生


要支持此功能而不重定向两次,意味着您将防护装置置于出口:

let path = "/"
navguard({path}, undefined, (to)=>this.$router.push(to||path))
这将使每个组件重定向到主页


顺便说一句,
路由器链接
组件



因为有赏金,所以不能将其标记为重复,因此后续是我在


tldr:
vm.$router.push(route)
是一个承诺,需要
.catch(e=>gotcatch(e))
错误。


这将在下一个@4中更改


Currently@3不区分错误是
导航失败
还是
常规错误

vm.$router.push(to)
之后的原始预期路由应该是
to
。因此,一旦发生重定向,就可以看到一些失败消息在修补路由器之前将路由器推送为承诺该错误被默默忽略。 当前的解决方案是在每次推送时反模式一个
.catch(…)
,或者预测设计中的变化,并将其包装以暴露失败

未来的计划是将这些信息转化为结果:

  let failure = await this.$router.push(to);
  if(failure.type == NavigationFailureType[type]){}
  else{}

Imo此错误仅由以下人员处理:

hook(route, current, (to: any) => { ... abort(createNavigationRedirectedError(current, route)) ...}
所以基本上,如果
to
包含重定向,这是一个错误,这相当于使用
vm.$router.push
进入一个防护

要忽略未处理的错误行为,可以传递一个空的onComplete(在将来的版本中中断):

或者用
试试。。捕获

try {

  await this.$router.push("/")
} catch {

}
这就防止了错误的发生


要支持此功能而不重定向两次,意味着您将防护装置置于出口:

let path = "/"
navguard({path}, undefined, (to)=>this.$router.push(to||path))
这将使每个组件重定向到主页


顺便说一句,
路由器链接
组件



我感谢你的回答,我确实看到了你的答案。然而,这似乎不适用于Nuxt中间件。我可能错了。但是我无法从中间件访问
这个
。关于如何从全局nuxt中间件处理这个问题,您有什么想法吗?谢谢。@Brad传递给中间件的参数是您的
this
,上面我解释了您的错误是由于重定向引起的。基本上,您将(1)路由到您的备忘单,但由于您未经身份验证,您将(2)路由到登录。因此,您的第一步抛出。我确实理解问题在于双重重定向。我想真正困扰我的是,这似乎是一项非常基本的任务(导航卫士),而nuxt中的中间件就是“nuxt”方式。为什么我在网上看不到更多关于这个问题的信息,而它似乎基本上影响了所有nuxt用户?此外,我也不知道如何在这种情况下以合理和实用的方式修复它。因为我希望在没有错误的情况下保护路由,并且不在每个文件中这样做。我是nuxt的新手,也是Vue的新手,所以我对您的建议不太满意。thanks@Brad我不知道您是如何初始化路由转换的,您告诉我的只是您使用了重定向,并且默认情况下使用
nuxt链接
扩展自
路由器链接
,这将消除重定向错误。你的问题是你从哪里开始你的路线,它期望你的最终路线是
备忘单
,但却得到了
登录
——从你提供的信息中,我无法判断你做了什么不同,但我可以猜你做了什么不同的事情。我愿意帮助你。请告诉我们您是如何开始路由的;)我真的很感激你的好意和帮助我的意愿。我不确定如何回应如何开始路由。在Nuxt中,路由器在默认情况下是魔法管理的,我将上面的代码作为“中间件”接入路由器