Search code examples
javascriptvue.jsvuejs2vue-routerinfinite-loop

Vue-Router infinite loop with redirect route


I'm trying to find the best way to redirect non-authenticated users to the login page/screen. Currently I'm trying to catch authentication with JWT tokens in the route before loading components. However, I'm getting snagged on the router.beforEach() with an infinite loop:

router.beforeEach((to, from, next) => {
  if (to.matched.some(r => r.meta.requiresAuth)) {
    alert('needs auth!'); // used for testing
    if (localStorage.getItem('jwt') == null) {
      next('/login'); // here is where the infinite loop hits
    } else {
      next();
    }
  } else {
    next();
  }
});

When I reach a route that needs to be authenticated, the next('/login') call gets stuck in an infinite loop. I can avoid this like so:

if (to.path !== '/login') {
    next('/login');
} else {
    next();
  }

But that calls the alert twice and seems like an inefficient and/or hacky way to go about this. Is there a better way to test for conditions for routes than this? Thanks for any tips, advice, help


Solution

  • I don't think this is hacky.

    if (to.path !== '/login') {
        next('/login');
    }
    

    As you are changing the route, it will naturally trigger router.beforeEach again.

    You could move it above if (to.matched.some(r => r.meta.requiresAuth)) { to avoid doing that check unnecessarily with

    if (to.path === '/login') {
        next();
    }
    

    An alternative is to jump out of the SPA with window.location, but I don't think that is better.