Axios-设置拦截器,可在发生错误时重试原始请求

时间:2020-08-25 17:37:45

标签: javascript vue.js axios vuex

我需要为所有axios调用设置全局拦截器。我在vuex操作中定义它们,我需要如果状态代码为429,则调用一个操作,然后在执行该操作之后,对原始请求进行重试。我正在学习拦截器,但是我不知道如何正确设置它,以及它是否可以在export default之外使用。谁能帮我吗?

axios.interceptors.use( (response) => {
// if no status error code is returned get the response
  return response
}, (error) => {
  console.log(error)
  // here I need to retry the ajax call after that my loadProxy action is made and a 429 status code is sent from the server
  return Promise.reject(error);
})

export default new Vuex.Store({
 actions: {
  loadProxy({ commit }) {
  // here I have an axios get request to fetch a proxy from an API 
  },
  fetchData({ commit, state }) {
  // here I fetch the data to use in my app, sometimes due to many requests I need to refresh the proxy ip to let the app continue working
  }
 }
})

2 个答案:

答案 0 :(得分:1)

Axios拦截器中的response对象包含一个config对象。 (See here

您可以使用该请求以原始配置重新发起请求。

一个例子:

axios.interceptors.response.use((response) => {
    return response;
}, (error) => {
    if (error.response.status === 429) {
        // If the error has status code 429, retry the request
        return axios.request(error.config);
    }
    return Promise.reject(error);
});

要在拦截器回调中使用Vuex动作,您可以先将存储定义为变量,然后在回调中调用调度函数。像这样:

const store = new Vuex.Store({
   // define store...
})

axios.interceptors.response.use((response) => {
    return response;
}, (error) => {
    if (error.response.status === 429) {
        store.dispatch("YOUR_ACTION");
        return axios.request(error.config);
    }
    return Promise.reject(error);
});

export default store;

答案 1 :(得分:1)

您可以使用axios-retry进行实验,有一个选择

retryCondition:用于进一步控制是否应重试请求的回调

import axiosRetry from "axios-retry"

// ...

// intercept
axiosRetry(axios, {
  retries: 3,
  retryCondition: (error) => {
    return error.response.status === 429
  },
})