在Vue路由器中未定义Vuex存储

时间:2019-04-18 23:30:45

标签: javascript vue.js vuejs2 vuex vue-router

我有一个路由器和一个全局beforeEach钩子来验证身份。

import store from "@/store/store";

const router = new Router({
    // routes...
});

router.beforeEach((to, from, next) => {
    if (to.matched.some(record => record.meta.requiresAuth)) {
        if (!store.getters.getAccessToken) { //undefined store
            next("/access/login");
        }
    }
    else {
        next();
    }
});

export default router;

在我的store/store.js文件中,我有一个操作,请求验证用户名/密码,然后尝试重定向到/路由(受保护的路由)。

import router from "@/router";

//state, getters...

actions: {
    login({commit}, authData) {
        // axios instance prototyped into vue $http object
        this._vm.$http.post("/auth/login", authData)
            .then(response => {
                commit("saveToken", response.data.token);
            })
            .catch((error) => {
                commit("loginError", error.response.data);
            });
    }
},
mutations: {
    saveToken(state, token) {
        state.accessToken = token;

        router.push({
            path: "/"
        });
    },
    loginError(state, data) {
        return data.message;
    }
}

我遇到的问题是store中的router.jsundefined。我已经多次检查了所有导入,路线和名称,它们很好。

由于我将router中的storestore中的router分别导入了,因此循环引用是否存在问题?

如果这是问题,如何从路由器或商店访问路由器?

编辑

我尝试从商店中删除路由器导入,并且除以下情况外,它都可以正常工作

router.push({
    path: "/"
});

因为未导入router

编辑:添加了@ tony19解决方案

我已经应用了@ tony19提供的解决方案,并且效果很好,但是当我访问/路由时,router.app.$store是不确定的。

固定代码:

router.beforeEach((to, from, next) => {
    console.log(`Routing from ${from.path} to ${to.path}`);

    if (to.matched.some(record => record.meta.requiresAuth)) {
        if (!router.app.$store.getters["authentication/getAccessToken"]) {
            next("/access/login");
        }
        else {
            next();
        }
    }
    else {
        next();
    }
});

带有调试会话的图像:

enter image description here

1 个答案:

答案 0 :(得分:2)

这确实是由循环引用引起的。您可以通过使用router.app来避免将存储导入到router.js中,{{3}}为路由器注入的相关Vue实例提供了参考。这样,您可以通过router.app.$store到达商店:

router.beforeEach((to, from, next) => {
  /* ... */
  if (!router.app.$store.getters.getAccessToken) {
    next("/access/login");
  }
});