开发者问题收集

Vue Router 不重定向

2018-02-08
15871

我目前尝试仅在用户登录时显示页面。我面临的问题是 requireAuth() 似乎被调用了无数次。

使用的代码是:

// Routes
const routes = [
    {
        path: '/',
        component: Dashboard,
        beforeEnter: (to, from, next) => {
            requireAuth(to, from, next);
        },
        children: [
            {
                path: '',
                name: 'dashboard',
                component: DashboardIndex
            }, {
                path: '*',
                name: '404',
                component: NotFound
            }
        ]
    },  {
        path: '/login',
        component: Login,
        name: 'login',
    },
];

function requireAuth (to, from, next) {
    if (!localStorage.token) {
        console.log('testing');
        next({
            path: '/login',
            query: { redirect: to.fullPath }
        })
    } else {
        next()
    }
}

// Routing logic
let router = new VueRouter({
    routes: routes,
    mode: 'hash'
});

testing 在我收到错误之前输出了 ~1000 次:

[vue-router] uncaught error during route navigation: warn @ app.js

app.js RangeError: Maximum call stack size exceeded

如果 !localStorage.token ,我如何确保 /login 被重定向到?

2个回答

我遇到了同样的问题,因为各个错误的来源都归结为 next() 函数,该函数是导航到具有 to.path 作为值的路径所必需的。如果您使用 router.pushrouter.replace ,则可能会被无限次调用,因为调用堆栈最大错误显示。因此,只需使用 next() 并让 router API 完成繁琐的工作

我做过这种事情,但方式不同。我在 main.js 文件中处理了所有逻辑。并且 routes.js 文件包含 -

var routes = [{
  path:'/login', 
  component: Login
 },
 { 
  path:'/',
  component: dashboard
 }]

现在我已经使用 vue-router API 控制了 main.js 文件中的所有类型的验证,并从中获得了帮助 - https://router.vuejs.org/en/api/route-object.html

所以现在 main.js 将包含 -

  const checkToken = () => {
    if(localStorage.getItem('token') == (null || undefined) ){
        console.log('token is not there : ' + localStorage.getItem('token'));
        return false;
    }
    else{
        return true
    }
    }


//then Use `router.push('/login')` as

router.beforeEach((to, from, next) => {
  if(to.path == '/') {
    if(checkToken()) { 
        console.log('There is a token, resume. (' + to.path + ')' + 'localstorage token ' + localStorage.getItem("token"));
        next();

    } else {
        console.log('There is no token, redirect to login. (' + to.path + ')');
        router.push('/login');
    }
}

因此,您可以像这样构造以控制 main.js 中的所有内容,并将 route.js 排除在外

Meet Zaveri
2018-02-08

如果您没有 localStorage 令牌,您将把用户重定向到 /login

因为这也是一个 Vue 路由,所以您的 requireAuth 逻辑将再次运行(因为它针对每个路由运行)。这意味着您刚刚创建了一个无限循环,即使用户已经在该页面上,用户也会不断被重定向到 /login

要停止这种情况,只需在您已经在 /login 上时不要重定向到 /login

我会把这部分留给你,但如果你明白发生了什么,它应该不难。

Stephan-v
2018-02-08