Как вызвать метод перед защитой навигации - PullRequest
0 голосов
/ 13 июля 2020

Я хотел бы знать, могу ли я вызвать функцию перед навигационной защитой. Когда пользователь вошел в систему, мой API возвращает объект пользователя с токеном доступа (хранится в памяти) и токеном refre sh (хранится только в cook ie http). При обновлении страницы мой API возвращает объект пользователя с новым токеном доступа, если есть действующий токен refre sh, но я не знаю, как это сделать перед защитой навигации. Моя навигационная защита - это просто метод beforeEach, который проверяет, есть ли пользовательский объект в магазине, если нет пользовательского объекта, он возвращается на страницу входа. Учитывая, что охранник вызывается перед вызовом API, он всегда отправляет пользователя по маршруту входа

Здесь маршрутизатор:

const routes = [
  {
    path: "/",
    name: "Home",
    component: Home,
  },
  {
    path: "/login",
    name: "Login",
    component: Login,
  },
  {
    path: "/about",
    name: "About",

    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () =>
      import(/* webpackChunkName: "about" */ "../views/About.vue"),
  },
];

const router = new VueRouter({
  routes,
});

router.beforeEach(async (to, from, next) => {
  if (to.name !== "Login" && !store.getters.user.userId) {
    next({ name: "Login" });
  } else next();
});

export default router;

Я хочу вызвать функцию refre sh ниже перед маршрутизатором и методом beforeEach (не перед маршрутом) для сохранения входа в систему с вызовом API, который возвращает новый объект пользователя

 async refresh({ commit }) {
        let response = await axios.post(user_uri + "refresh_token");
        commit("setUser", response.data);
      },

1 Ответ

0 голосов
/ 13 июля 2020

я не уверен, что это именно ваш случай, но для меня сработало что-то вроде этого:

router.beforeEach((to, from, next) => {
   checkLogin(to, from, next)
})


let checkLogin = async (to, from, next) => {
    if (from.fullPath === "/") {
        await getToken() // 
    }
    next()
}

let getToken= async () => {
   //....
}


const routes = [
   {path: '/', component: homeScreen},
   {
      path: '/your-path', component: yourComponent,
      children: [...],
      async beforeEnter(to, from, next) {
          if (//chack if logged in) next()
          else
              vue.$router.push('/login')
      }
   },
]

в этом случае пользователь может видеть только домашнюю страницу без входа в систему.

...