В настоящее время я пытаюсь показывать только страницы, если пользователь вошел в систему. Проблема, с которой я сталкиваюсь, заключается в том, что 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] ошибка при открытии маршрута: warn @app.js
app.js RangeError: превышен максимальный размер стека вызовов
Как я могу убедиться, что /login
перенаправлен на if !localStorage.token
?
Я столкнулся с той же проблемой, что и соответствующий источник ошибок, все сводится к next()
функции, которая необходима для перехода к пути, который имеет to.path
как значение. Если вы будете использовать router.push
или router.replace
тогда можно вызвать бесконечное количество раз, когда отображается ошибка ошибки callstack. Поэтому используйте просто next()
и пусть API-интерфейс router
выполняет громоздкую работу
Я делал это, но по-разному. Я обработал всю логику в файле main.js
и файл routes.js
содержит -
var routes = [{
path:'/login',
component: Login
},
{
path:'/',
component: dashboard
}]
Теперь я контролировал все типы валидации в файле main.js, используя API vue-router
интерфейс vue-router
качестве помощи от этого - 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
outta route.js
Если у вас нет токена localStorage
вы перенаправляете пользователя в /login
.
Поскольку это также маршрут Vue, ваша логика requireAuth снова будет работать (поскольку она выполняется для каждого маршрута). Это означает, что вы только что создали бесконечный цикл, в котором пользователь будет постоянно перенаправляться в /login
даже если пользователь уже находится на этой странице.
Чтобы остановить это, просто не переадресовывайтесь в /login
когда вы уже находитесь в /login
.
Я оставлю эту часть вам, но это не должно быть так сложно, если вы поймете, что происходит.