Node.js Axios侦听器在状态为200且数据为空时重试http请求
在某些数据准备就绪之前,我会短时间轮询一个端点。我希望重试该请求最多10次 当数据还没有准备好时,我收到一个带有空数组的200 当数据准备就绪时,我接收到一个带有非空数组的200 我使用以下库Node.js Axios侦听器在状态为200且数据为空时重试http请求,node.js,reactjs,http,axios,Node.js,Reactjs,Http,Axios,在某些数据准备就绪之前,我会短时间轮询一个端点。我希望重试该请求最多10次 当数据还没有准备好时,我收到一个带有空数组的200 当数据准备就绪时,我接收到一个带有非空数组的200 我使用以下库 我已经创建了一个axios拦截器来检查数组的长度,如果它的0我抛出了一个错误。但是,axiosRetry没有捕获到这一点,此时我希望重试该请求。相反,它被捕获在try-catch块中并结束。您不需要axios重试,只需要axios及其响应拦截器,执行以下步骤: 检查数据是否为空。如果是,抛出一个axio
我已经创建了一个axios拦截器来检查数组的长度,如果它的0我抛出了一个错误。但是,axiosRetry没有捕获到这一点,此时我希望重试该请求。相反,它被捕获在try-catch块中并结束。您不需要axios重试,只需要axios及其响应拦截器,执行以下步骤:
axios.Cancel
错误。这将取消请求,调用错误处理程序而不是成功处理程序const axios = require('axios');
const MAX_RETRY = 10;
let currentRetry = 0;
function successHandler() {
console.log('Data is Ready');
}
function errorHandler() {
if (currentRetry < MAX_RETRY) {
currentRetry++;
console.log('Retrying...');
sendWithRetry();
} else {
console.log('Retried several times but still failed');
}
}
function sendWithRetry() {
axios.get('http://example.com')
.then(successHandler).catch(errorHandler);
}
axios.interceptors.response.use(function (response) {
if (response.data.metrics.length) {
throw new axios.Cancel('Operation canceled by the user.');
} else {
return response;
}
}, function (error) {
return Promise.reject(error);
});
sendWithRetry();
您不需要axios重试,只需要axios及其响应拦截器,步骤如下:
axios.Cancel
错误。这将取消请求,调用错误处理程序而不是成功处理程序const axios = require('axios');
const MAX_RETRY = 10;
let currentRetry = 0;
function successHandler() {
console.log('Data is Ready');
}
function errorHandler() {
if (currentRetry < MAX_RETRY) {
currentRetry++;
console.log('Retrying...');
sendWithRetry();
} else {
console.log('Retried several times but still failed');
}
}
function sendWithRetry() {
axios.get('http://example.com')
.then(successHandler).catch(errorHandler);
}
axios.interceptors.response.use(function (response) {
if (response.data.metrics.length) {
throw new axios.Cancel('Operation canceled by the user.');
} else {
return response;
}
}, function (error) {
return Promise.reject(error);
});
sendWithRetry();
或者,如果数据不存在,axiosRetry知道重试,是否有办法截取响应并覆盖它。如果数据不存在,是否有办法截取响应并覆盖它,axiosRetry知道重试。我想使用axios retry作为内置的退避策略。没有办法使用axios重试库进行重试吗?@Kay不幸的是,我认为没有任何方法可以使用axios重试来实现您的需求。我已经编辑了我的答案来说明原因。哦,太糟糕了,我将不得不考虑使用不同的库,可以在2xx上进行重试,以及退避策略。也许如果你或其他看到这一点的人知道这样一个库,你可以推荐它。嗨,@Kay,正如我在回答中所描述的,你不需要任何新的库:)你可以实现你自己的“在2xx上重试”逻辑作为退避。我想使用axios retry作为它内置的退避策略。没有办法使用axios重试库进行重试吗?@Kay不幸的是,我认为没有任何方法可以使用axios重试来实现您的需求。我已经编辑了我的答案来说明原因。哦,太糟糕了,我将不得不考虑使用不同的库,可以在2xx上进行重试,以及退避策略。也许,如果你或其他看到这一点的人知道这样一个库,你可以推荐它。嗨,@Kay,正如我在回答中所描述的,你不需要任何新的库:)你可以实现你自己的“在2xx上重试”逻辑作为退避。
export default function axiosRetry(axios, defaultOptions) {
axios.interceptors.request.use(config => {
const currentState = getCurrentState(config);
currentState.lastRequestTime = Date.now();
return config;
});
axios.interceptors.response.use(null, error => {
const config = error.config;
// If we have no information to retry the request
if (!config) {
return Promise.reject(error);
}
....