Что у меня есть:
- маршрутизатор с необходимыми для авторизации маршрутами и общими маршрутами
- vuex с состоянием авторизации пользователя
Что я хочу: отправить запрос на сервер с помощью axios
для проверки состояния авторизации пользователя до загрузки приложения (до разрешения маршрутизатора).
router.js
:
import Vue from 'vue'
import Router from 'vue-router'
import store from './store'
Vue.use(Router)
const router = new Router({
...
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/account',
name: 'account',
component: () => import(/* webpackChunkName: "account" */ './views/Account.vue'),
meta: {
requiresAuth: true
}
}
]
})
router.beforeEach((to, from, next) => {
if (to.matched.some(route => route.meta.requiresAuth)) {
if (store.state.authStatus)
next()
else
next({name: 'home'})
} else {
next()
}
})
export default router
store.js
:
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
authStatus: false
},
mutations: {
setAuthStatus(state, authStatus) {
state.authStatus = authStatus
}
}
})
axios.get(...)
.then(response => {
store.commit('setAuthStatus', true)
})
export default store
main.js
:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
Моя проблема : при вводе mydomain.com/acount
в браузере (приложение не загружалось до этого) во время авторизации я все равно получил перенаправление на home
.И после перенаправления я вижу, что я авторизован (я установил некоторый элемент DOM внутри компонента Home, который отображается только для авторизованных пользователей).
Я пробовал это, не помогло:
store.js
:
const store = new Vuex.Store({
...
actions: {
setAuthStatus({commit}) {
axios.get(...)
.then(response => {
commit('setAuthStatus', true)
})
}
}
})
main.js
:
store.dispatch('setAuthStatus').then(() => {
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
})
Редактировать: в main.js
Я пытался перейти с
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
до
new Vue({
store,
router,
render: h => h(App)
}).$mount('#app')
и это тоже не помогло.