Суть в следующем: есть приложение на Vue3.
В корневом компоненте, нужно проверить токен из localStorage.
Если его там нет, то отправить на страницу логина.
Если он там есть, то обратиться к API для того, чтобы проверить акуальность токена.
Если он акуален, то загрузить главную страницу приложения. Если не актуален, то так же отправить на страницу логина.
Проблема в том, что если проверку токена через API положить в beforeMount или другие похожие хуки, то если обновить страницу (или зайти на неё), то есть вероятность получить ошибку авторизации, т.к. токен ещё не проверился, а дочерние компоненты уже подгрузились и пытаются к своим точкам в API достучаться, с пустым токеном.
Если же попробовать проверку запихать в setup, то там та же проблема. При этом если setup сделать async, то приложение не грузится. Про suspense читал, но не до конца понял как оно работает.
Сейчас пока остановился на следующем коде (код пока не рабочий):
export default {
async setup() {
const store = useStore();
let localToken = localStorage.getItem('token');
let isLogined = false;
if(localToken) {
await checkToken(localToken).then(response => {
if(response.data?.check) {
isLogined = true;
store.setToken(localToken);
}
});
}
return { store, localToken, isLogined }
},
beforeMount() {
if(!this.localToken || !this.isLogined) {
this.$router.push({ name: 'login' })
}
if(this.store.getToken() && this.$route.name == 'login') {
this.$router.push({ name: 'notices.list' });
isLogined = true;
}
if(this.store.getToken() && this.isLogined) {
this.store.reloadPages();
this.store.loadBlockTypes();
}
}
}