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

news/2024/7/10 0:00:44 标签: vue, javascript

路由跳转错误....目录

  • vue路由跳转错误:Uncaught (in promise) Error: Redirected when going from "/layout/home" to "/layout/user" via a navigation guard.
    • 问题重现及产生原因
    • 解决方式一: 投机取巧式
    • 解决方式二: 啰嗦式
    • 解决方式二: 高逼格式 (推荐)

vueUncaught_in_promise_Error_Redirected_when_going_from_layouthome_to_layoutuser_via_a_navigation_guard_1">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)=>{})
}

http://www.niftyadmin.cn/n/1263691.html

相关文章

Promise、try-catch-finally、async-await

前言: 以下示例代码, 基于node运行环境 Promise Promise是一个容器,保存异步代码的执行结果;作用:解决异步回调地域(异步代码,层层嵌套);缺陷:语法、编码上还是存在嵌套现象 文件路径: const fs require(fs) function createPromise(name){return new Promise((resolve, re…

JS中Object.getOwnPropertyNames()与Object.keys(obj)的区别

大部分情况下Object.getOwnPropertyNames()与Object.keys(obj)的功能是一样的, 都是获取对象中的所有属性, 并以数组的形式返回. 区别: Object.getOwnPropertyNames返回的是对象中所有自己的属性;Object.keys(obj)则返回的对象中所有自己的属性,也就是属…

项目中2个Token的原因

问题: 项目中2个Token, 一个时效2个小时(简称:短Token), 另一个时效14天(简称:长Token), 为什么要用2个Token? 解答: 基于安全性, 防止Token泄露的考虑, 服务器资源中所有的请求都只能使用短Token, 并且短Token只有2小时时效; 这个方法依然无法完全解决防止Token泄露的问题,…

JS之预解析和变量提升

什么是预解析? 概念: JS代码在在代码从上往下执行前,浏览器会先把所有变量声明解析一遍, 这个阶段叫预解析。 详讲 寻找作用域中的var 和function声明(匿名函数没有function声明,所以不会提升),然后对其进行事先声明…

JS三座大山-同步异步-作用域、闭包-原型、原型链

JS三座大山-同步异步-作用域、闭包-原型、原型链JS三座大山同步异步同步异步区别作用域、闭包函数作用域链块作用域闭包闭包和直接返回值有差别闭包的几种写法闭包作用1:延长变量生命周期闭包作用2: 限制访问闭包调用注意事项闭包解决用var导致下标错误的…

解决vue中, vant插件,van-img标签无法读取本地图片问题

问题 在使用移动端布局框架, vantjs的时候, 本地图片无法加载: 解决 先将需要使用的图片导入import imgA from /assets/a.jpg import imgB from /assets/b.jpg将导入的图片, 放到data数据中:// 这里采用对象简写形式 data () {return {imgA,imgB} },结构代码: 由于src需要读…

JS-函数防抖与节流

JS-函数防抖与节流目录防抖引入防抖场景1(鼠标移入)防抖场景2(键盘按键)函数节流防抖 经典应用常见: 手风琴效果 引入 没有做防抖的网站: 做了防抖的网站: 防抖场景1(鼠标移入) 抖动 : 用户本来不想触发这个交互,但是由于鼠标不小心抖动误触发交互…

项目中, 后端使用其他网站的图片等资源报403与404错误

出现404与404错误原因 因为我们的服务器里面的图片并不是自己的,而是从网上找的一些图片链接;403原因:没有权限。 有的服务器图片做了防盗链处理,不允许在别人的网页去获取他们的服务器;404原因:路径错误。 有的图片可能被别人删…