路由跳转错误:Uncaught (in promise) Error: Redirected when going from “...“ to “...“ via a navigation guard

vue路由跳转错误:Uncaught (in promise) Error: Redirected when going from “/layout/home” to “/layout/user” via a navigation guard.

问题重现及产生原因

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tB7n3BoM-1627995094220)(11/image-20210803203152516.png)]
原因:
  vue-router路由版本更新产生的问题,导致路由跳转失败抛出该错误;
真正的原因是由于返回了一个Promise对象, 正常的跳转由then方法执行 当正常的路由跳转, 被"路由导航守卫"拦截并重新指定路由时, 由于 this.$router.push() 返回的是Promise对象, 此时then方法不能正常执行, 无法跳转到指定路由, 就触发了该对象的捕获错误的方法, throw抛出错误, 但并不影响程序功能.




  1. 在项目开发中,并不是每一个路由跳转都是明确的。 例如很多页面跳转需要登录判断,如果你有登录,则跳转到指定页面,没有登录则跳转到登录页面。

项目代码:

  1. 项目中, 使用路由跳转页面, this.&router.push() 这个方法, 返回Promise对象, 如果不能正常跳转, 内部会抛出错误, 但是这个错误并不影响程序执行, 如果想解决控制台打印报错信息, 有3种方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K88puIDk-1627995094222)(11/image-20210803203107821.png)]





解决方式一: 投机取巧式

  • 在被路由导航守卫拦截后, 执行代码 console.clear() , 清空控制台的报错信息;
  • 注意: next()方法是异步函数, 需要在定时器中添加 console.clear() , 把这个操作添加进异步队列
router.beforeEach((to, from, next)=>{
  if(to.meta.isShow && !getToken()){
    next('/login')

    setTimeout('console.clear()', 300)
    
    return
  }
  next()
})




解决方式二: 啰嗦式

// 使用编程式导航跳转时,每次使用,后面都跟上.catch方法,捕获错误信息

this.$router.push('/location').catch(err => ())




解决方式二: 高逼格式 (推荐)

  • 通过重写VueRouter原型对象上的push方法, 覆盖原来抛出异常的方法, "吞掉"异常
  • 切记: 一定要在router创建实例之前
import VueRouter from 'vue-router'

/* 在创建router实例对象之前,手动覆盖原型链的push来吞掉报错catch */
// 先存储默认底层的push
const originPush = VueRouter.prototype.push
// 覆盖原型链的push
VueRouter.prototype.push = function(location,resolve,reject){
    // this:路由实例对象
    
    // 判断用户有没有传后面两个可选参数
    if( resolve || reject ){
      return originPush.call(this,location,resolve,reject)
    }else{// 用户只传了第一个参数
      /* 
      默认底层: catch()方法代码  throw err : 抛出异常
      吞掉报错原理: 重写catch()方法,把默认底层的 throw err给去掉,就不会抛出异常
      */
      return originPush.call(this,location).catch(err => {
        //  throw err
      })
    }
}

const router = new VueRouter({
  routes
})

上述代码简化:

import VueRouter from 'vue-router'

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location, resolve, reject) {
    if ( resolve || reject ) return originalPush.call(this, location, resolve, reject)
    return originalPush.call(this, location).catch((e)=>{})
}
  • 39
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: 这个错误是因为在使用导航守卫时,从"/login"页面跳转到"/home"页面时发生了重定向。可能是因为您的导航守卫设置有误或者您的路由配置有问题。您可以检查一下您的导航守卫和路由配置,看看是否有错误。 ### 回答2: 这个错误是由于路由导航守卫 (navigation guard) 的重定向 (redirect) 执行不成功导致的。在这种情况下,用户试图从 "/login" 页面跳转到 "/home" 页面,但是路由导航守卫检测到用户没有登录,需要重定向到登录页面。然而,在重定向到登录页面时,出现了一个错误,也就是 "uncaught (in promise) error: redirected when going from "/login" to "/home" via a navigation guard.",意思是在执行导航守卫重定向时,出现了一个未捕获的错误。 这个错误的原因可能有很多种,比如说: 1. 用户没有登录。这是最常见的原因,当用户试图进入特定页面时,需要检查用户是否已经登录。如果没有登录,就会自动重定向到登录页面。如果登录页面本身存在问题,就会出现上述错误。 2. 路由配置错误。有时候路由配置可能会出现问题,比如配置了错误路由重定向,或者未正确配置路由导航守卫。 3. 编程错误。开发人员可能会在代码中犯一些错误,比如格式错误、语法错误或逻辑错误等,这些错误可能会导致导航守卫重定向失败。 针对这个错误,我们可以采取以下措施: 1. 确保登录页面的代码没有问题,比如检查代码是否正确、登录逻辑是否正常等。 2. 检查路由配置,确保路由重定向配置正确,并正确配置路由导航守卫。 3. 检查代码逻辑,查看是否有导致导航守卫重定向失败的错误。 4. 添加错误处理机制,能够及时捕获错误并进行处理。 总之,当出现 "uncaught (in promise) error: redirected when going from "/login" to "/home" via a navigation guard." 错误时,我们需要仔细检查,并在问题解决后及时更新代码。 ### 回答3: 在进行路由导航时,用户经常会遇到“未捕获的(在promise中)错误:在导航守卫中,从“/login”重定向到“/home””的错误提示。 这个错误通常是由于导航守卫的代码逻辑判断出错所导致的。导航守卫是Vue.js框架中一个重要的特性,它允许开发者在路由导航之前或之后进行一些操作、钩子拦截等。而这个错误是由于在导航守卫中,从/login到/home的判断逻辑错误导致的路由重定向。 解决这种错误的方法通常有以下几个步骤: 1. 检查导航守卫中的逻辑错误。通常这个问题在代码逻辑或者执行顺序错误时会出现。我们要仔细研究导航守卫的代码,看看是否有判断条件错误、语句顺序错误等问题。 2. 检查路由的配置。我们应该检查路由的配置,确保路由配置文件中的路径和导航守卫中的路径是一致的。如果路径不正确,那么就会出现路由重定向的错误。 3. 检查路由组件中的代码。我们需要检查路由组件中的代码,看看是否有更新路由数据的方法、改变了路由状态或者重定向功能等,如果有那么我们应该需要正确地处理这些功能。 总之,“未捕获的(在promise中)错误:在导航守卫中,从“/login”重定向到“/home””通常会发生在路由导航过程中,常见的原因是导航守卫逻辑出错,路由配置错误或者组件代码逻辑出错。我们只需要检查这些问题,并尝试修复它们,就可以解决这个问题了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值