我的 Vue 应用程序在身份验证时遇到路由器问题,但仅在第一页加载时...
我所有的路由都在一个中间件下,以检查它们是否被记录,所以我的路由器看起来像这样:
import Vue from 'vue'
import Router from 'vue-router'
import store from './store'
Vue.use(Router);
let router = new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'root',
component: resolve => require(['./views/Root.vue'], resolve),
meta: {
pageTitle: `Index`,
}
},
{
path: '/authentication/',
name: 'authentication',
component: resolve => require(['./views/Login.vue'], resolve),
meta: {
pageTitle: `Connexion`,
authNotRequired: true,
}
},
],
});
router.beforeEach((to, from, next) => {
//Si l'Utilisateur est authentifié :
if (!store.getters.isLoggedIn && !to.matched.some(r => r.meta.authNotRequired)) {
next({ name: 'authentication' });
}
else {
next();
}
});
export default router;
我的会话存储非常简单:
import Vue from 'vue'
import Vuex from 'vuex'
import VuexPersist from 'vuex-persist'
Vue.use(Vuex);
const vuexLocalStorage = new VuexPersist({
key: 'my.personal.key',
storage: window.localStorage,
})
export default new Vuex.Store({
plugins: [vuexLocalStorage.plugin],
state: {
session: {
sessionId: null,
},
},
getters: {
isLoggedIn: (state) => {
return (state.session.sessionId !== null);
},
},
mutations: {
save(state, session) {
state.session = session;
},
destroy(state) {
state.session = {};
},
},
actions: {
save(context, payload) {
return new Promise((resolve, reject) => {
context.commit('save', payload);
resolve();
});
},
destroy(context) {
return new Promise((resolve, reject) => {
context.commit('destroy');
resolve();
});
}
}
});
所以我的登录功能也很简单:
/* THE FORM WAS SUCCESSFULLY SENT TO THE API WHICH ANSWERED {obj.id: 456} */
onLogIn(obj) {
this.$store.dispatch('save', { sessionId: obj.id }).then(() => {
this.$router.push({ name: 'root' });
});
},
因此,当应用程序已经启动时,此代码工作正常,如果我断开连接并重新连接,重定向工作正常......实际上一切都很好...... 但是当用户第一次加载页面并登录时,路由器没有推送新路由,因此用户留在身份验证页面上,但会话已更改(如果我放置一个 console.log 我在商店中有 sessionId)
我真的不明白为什么重定向在第一次加载时不起作用,我发现当我执行 localStorage.clear() 然后重新加载页面并尝试连接它也不起作用。
你知道它为什么这样做吗?