рендеринг базы страниц на основе аутентификации в SSR nuxtjs

#javascript #vue.js #nuxt.js

#javascript #vue.js #nuxt.js

Вопрос:

Я пытаюсь создать сайт SSR, возникли некоторые проблемы при рендеринге на основе аутентификации, страница не может отображаться корректно при входе пользователя в систему.

nuxt.config.js

 module.exports = {
    router: {
        middleware: [
            'check-auth'
        ]
    }
}
  

middleware/check-auth.js

 import axios from 'axios';
export default async ({ store }) => {
    const token = store.getters['auth/token'];
    if (!!token) {
        axios.defaults.headers.common.Authorization = `Bearer ${token}`;
        if (!store.getters['auth/check']) {
            await store.dispatch('auth/fetchUser');
        }
    }else{
        delete axios.defaults.headers.common.Authorization;
    }
}
  

store/auth.js

 import axios from 'axios';
import Cookie from 'js-cookie';

export const state = () => ({
    user: null,
    token: null
});

export const getters = {
    user: state => state.user,
    token: state => state.token,
    check: state => state.user !== null
};

export const mutations = {
    setToken(state, token){
        state.token = token;
    },
    fetchUserSuccess(state, user){
        state.user = user;
    },
    fetchUserFailure(state){
        state.user = null;
    },
    logout(state){
        state.token = null;
        state.user = null;
    },
    updateUser(state, { user }){
        state.user = user;
    }
}

export const actions = {
    saveToken({ commit }, { token, remember }){
        commit('setToken', token);
        Cookie.set('token', token, { expires: remember ? 365 : null });
    },
    async fetchUser({ commit }){
        try{
            const { data } = await axios.get('/auth/user');
            commit('fetchUserSuccess', data);
        }catch(e){
            Cookie.remove('token');
            commit('fetchUserFailure');
        }
    },
    updateUser({ commit }, payload){
        commit('updateUser', payload);
    },
    async logout({ commit }){
        try{
            await axios.delete('/auth/authorizations');
        }catch(e){}
        Cookie.remove('token');
        commit('logout');
    }
}
  

utils/index.js

 export function cookieFromRequest(request, key){
    if (!request.headers.cookie) {
        return;
    }
    const cookie = request.headers.cookie.split(';').find(
        c => c.trim().startsWith(`${key}=`)
    );
    if (cookie) {
        return cookie.split('=')[1];
    }
}
  

страница/index.vue

 <template>
    <div>
        <template v-if="!user">
            <nuxt-link to="/login">Login</nuxt-link>
        </template>
        <template v-else>
            <nuxt-link to="/account">Account</nuxt-link>
        </template>
    </div>
</template>
<script type="text/javascript">
import { mapGetters } from "vuex";
export default{
    computed: mapGetters({
        user: 'auth/user'
    })
}
</script>
  

Каждый раз после входа в систему (был записан файл cookie и была получена информация о пользователе) я обновляю страницу, которую я всегда получаю Login вместо Account , но когда я пытаюсь перейти по другому URL, промежуточное программное обеспечение работает, и оно будет отображаться как Account .

Я надеюсь отобразить его до того, как html был отправлен клиенту, как я могу это сделать?

Извините за так много кодов, я не знаю, как воспроизвести его в изолированной среде, потому что он основан на API аутентификации. Большое спасибо за ваши мнения!