我有一个路由器和一个全局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.js
是undefined
。我已经多次检查了所有导入,路线和名称,它们很好。
由于我将router
中的store
和store
中的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();
}
});
带有调试会话的图像:
答案 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");
}
});