首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据后端响应初始化Vue应用程序?

如何根据后端响应初始化Vue应用程序?
EN

Stack Overflow用户
提问于 2022-01-01 08:10:42
回答 2查看 561关注 0票数 1

我希望在应用程序中的其他任何东西之前运行一些代码,该代码将发送一个请求到后端,然后更新商店。我需要先执行这个部分,因为线路警卫依赖它,如何实现?

代码示例

获取用户信息&设置

代码语言:javascript
复制
async init() {
    await AuthService.initCSRF();
    await AuthService.getUser().then((res) => {
      if (res.data && res.data.user) {
        this.loginLocally(res.data.user);
      } else {
        this.logoutLocally();
      }
    });
}

Auth警卫

代码语言:javascript
复制
export function isLoggedIn(to, from, next) {
  console.log('Checked', store.state.auth.isLoggedIn);
  if (store.state.auth.isLoggedIn) {
    next();
    return;
  }

  next({ name: 'login' })
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-01 09:42:03

在我以前的项目中,我做了这样的事情。希望你能有一些想法。

app.js

代码语言:javascript
复制
import App from './components/App.vue'
store.dispatch('auth/attempt', sessionStorage.getItem('token')).then(() =>{
new Vue({
    el: '#app',
    router,
    store,
    render: h => h(App),
 });
});

这里,我正在验证保存在本地存储中的令牌,然后再呈现应用程序。

我的Vuex行为就像这样

代码语言:javascript
复制
async signIn({dispatch}, credentials) {
  let response = await axios.post("auth/signin", credentials);
  await dispatch('attempt', response.data.token)
},


async attempt({commit, state}, token) {
  if (token) {
    await commit('SET_TOKEN', token);

  }
  if (!state.token) {
    return;
  }

  try {
    let response = await axios.get('auth/me');
    commit('SET_USER', response.data)
  } catch (e) {
    commit('SET_TOKEN', null);
    commit('SET_USER', null);
  }
},
async signOut({commit}) {
  axios.post('auth/signout').then(() => {
    commit('SET_TOKEN', null);
    commit('SET_USER', null);
  });
}

我使用订阅服务器侦听更改,并在请求标头中添加或删除令牌

代码语言:javascript
复制
import store from '../store'

store.subscribe((mutation) => {

 if (mutation.type === 'auth/SET_TOKEN') {
  if (mutation.payload) {
   axios.defaults.headers.common['Authorization'] = `Bearer ${mutation.payload}`;
  sessionStorage.setItem('token', mutation.payload);
} else {
  axios.defaults.headers.common['Authorization'] = null;
  sessionStorage.removeItem('token');
  }
 }
});

最后,一个axios拦截器用于句柄令牌过期。

代码语言:javascript
复制
import router from '../plugins/router'
import store from '../store'
import axios from "axios";

axios.interceptors.response.use((response) => {

  return response;
}, (error) => {
if (error.response.status) {
  if (error.response.status === 401) {

  if (router.currentRoute.name !== 'landing') {
    store.dispatch('auth/clearToken').then(() => {
      router.replace({
        name: 'landing'
      });

    }).finally(() => {
      swal.fire(
        'Your Session is Expired',
        'Please sign in again!',
        'error'
      )
    });
    }
  }
}

return Promise.reject(error);
});
票数 2
EN

Stack Overflow用户

发布于 2022-01-01 09:00:08

初始化承诺可以在调用.mount(...)之前等待。问题是Vue路由器启动与申请分开,不会以这种方式延迟。

如果取决于初始化过程的是路由器,延迟路由器启动的一种方法是等待路由器钩子中的承诺在其他路由器之前触发:

代码语言:javascript
复制
const initPromise = init();

...

router.beforeEach(async (to, from, next) => {
  await initPromise;
  next();
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70547631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档