Quasar \ VueJS 3无限路由循环/

Quasar \ VueJS 3 infinite route looping/

我的 routes.js 文件中有一些路线

path: '/main',
    component: () => import('layouts/MainLayout.vue'),
    beforeEnter: (to, from, next) => {
      console.log(store.authState.auth.role)
      if (Number(store.authState.auth.role) === 4) {
        next({ path: '/main/admin' })
      } else {
        next()
      }

    },
    children: [
      {
        path: '',
        component: () => import('pages/Main.vue'),
        meta: { requiresAuth: true }
      },
      {
        path: 'user',
        component: () => import('pages/User.vue'),
        meta: { requiresAuth: true }
      },
      {
        path: 'admin',
        component: () => import('pages/Admin.vue'),
        meta: { requiresAuth: true }
      }
    ]
  }

我在 index.js 路由器文件中有一些代码:

Router.beforeEach((to, from, next) => {
    if (to.matched.some(record => record.meta.requiresAuth) && !store.authState.auth.state) {
      next({ path: '/' })
    } else {
      next()
    }
  })

主要思想是 - 如果用户未登录 - 重定向到 root,如果用户登录并转到 /main 路由,则取决于他的角色路由器必须将他重定向到特定路由。 但事实上 - 我得到了角色 === 4 的无限循环(示例) - 我做错了什么?谢谢

您的 beforeEnter 导航守卫应用于整个 /main 路线,并且 /main/admin 嵌套在该路线中。这意味着守卫正在 /main/admin 本身上被调用,因此任何请求该页面(或被重定向到该页面)的管理员用户都将从该页面重定向到它自己。

根据您的描述,您可能只想将导航守卫应用于确切的 /main 路线,而不是整棵树。然后,您可以继续重定向到 next({ path: '/main/user' }),而不是简单地在守卫的末尾接受带有 next() 的当前路径。如果那是你想要的,那么你实际上根本不需要 component ,因为永远不会呈现路线。这是它的样子:

path: '/main',
    component: () => import('layouts/MainLayout.vue'),
    children: [
      {
        path: '',
        component: () => import('pages/Main.vue'), // FIXME: not needed?
        meta: { requiresAuth: true },
        beforeEnter: (to, from, next) => {
          if (Number(store.authState.auth.role) === 4) {
            next({ path: '/main/admin' })
          } else {
            next({ path: '/main/user' })
          }
        },
      },
      {
        path: 'user',
        component: () => import('pages/User.vue'),
        meta: { requiresAuth: true }
      },
      {
        path: 'admin',
        component: () => import('pages/Admin.vue'),
        meta: { requiresAuth: true }
      }
    ]
  }