开发者问题收集

Axios 拦截器-如何从 Vuex 存储返回响应

2020-03-06
1364

我有一个登录表单。当用户输入用户名/密码时,axios 拦截器会处理来自 api 的响应,无论它是好是坏。

然后,响应通过我的 vuex 存储进行路由,用户凭据在那里设置。

但是,当我在登录组件中 console.log 响应时,我实际上看不到我需要的字段,例如 数据、状态、标题 等。我看到了这一点

来自 vuex 存储的响应,来自 axios 拦截器响应之后

在继续登录用户之前,有什么方法可以验证我的数据是否在存储中?

目前我唯一能想到的就是使用 setTimeout 3 秒并调用状态 getter 来检索用户数据。我的意思是它可以工作,但我确信还有更合适的解决方案

Login.vue

onClickLogin() {
    const userToLogin = {
      username: this.loginForm.username,
      password: this.loginForm.password
    };
    const response = UsersModule.login(userToLogin);

    console.log("response", response); // returns what is pictured in the image above so the if block is technically wrong
    if (response) {
      this.$router.push("/");
    }
  }

axios 请求类

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL,
  timeout: 5000
});

service.interceptors.response.use(
  response => {
    return response.data;
  },
  error => {
    Message({
      message: error.message || "Error",
      type: "error",
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);

vuex 用户登录功能

  @Action({ rawError: true })
  async login(usersSubmit: UserSubmit) {
    const response: any = await loginUser(usersSubmit);
    if (typeof response !== "undefined") {
      const { accessToken, username, name } = response;

      setToken(accessToken);
      this.SET_TOKEN(accessToken);
      this.SET_USERNAME(username);
      this.SET_NAME(name);
    }
  }

从 vuex 存储调用 axios 请求的 api 类

export const loginUser = (data: UserSubmit) => {
  return request({
    url: "/auth/login",
    method: "post",
    data
  });
};
1个回答

loginasync 函数,这意味着它返回一个承诺,就像问题描述的那样。

异步控制流和承诺尤其具有传染性,这要求所有依赖它的调用者也使用承诺。请注意, login 不返回任何内容,因此它无法解析为响应:

  async onClickLogin() {
    const userToLogin = {
      username: this.loginForm.username,
      password: this.loginForm.password
    };

    try {
      await UsersModule.login(userToLogin);
      this.$router.push("/");
    } catch (err) {
      console.error('Login failed');
    }
  }
Estus Flask
2020-03-06