首页 > 其他分享 >Axios请求失败重试实现

Axios请求失败重试实现

时间:2024-06-01 14:22:06浏览次数:26  
标签:Axios 请求 err res request 重试 retry config log

代码实现

// request.ts

import axios, { AxiosRequestConfig } from "axios";

// 自定义ReuqestConfig
interface RetryConfg extends AxiosRequestConfig {
    retry: number,
    retryDelay: number,
    retryCount?: number;
}

// 创建请求实例
const request = axios.create();

// 响应拦截
request.interceptors.response.use(res => {
    return res;
}, err => {
    const config: RetryConfg = err.config;
    
    // 重试配置判断
    if (!config || !config.retry) {
        return Promise.reject(err);
    }
    
    // 重试次数判断
    config.retryCount = config.retryCount || 0;
    if (config.retryCount >= config.retry) {
        return Promise.reject(err);
    }
    
    // 次数自增
    config.retryCount++;
    
    // 重试
    return new Promise<void>((resolve) => {
        // 延迟
        setTimeout(() => {
            resolve();
        }, config.retryDelay || 0);
    }).then(() => {
        console.log(`retyrCount ==> : ${config.retryCount}`);
        return request(config);
    });
});

// 暴露导出
export default request;
export type { RetryConfg };

测试环境

// server.ts

import express from "express";

const app = express();

app.use(express.json());

app.post("/retry", (req, res) => {
    console.log(`Path: Path: ${req.path}`);
    return res.status(500)
        .json({
            code: 500,
            message: "error"
        });
});

const port = 3000;
app.listen(port, () => {
    console.log(`The service starts on port ${port}.`);
});

测试代码

// client.ts

import request, { RetryConfg } from "./request";

const config: RetryConfg = {
    retry: 3,
    retryDelay: 3000,
    url: "http://localhost:3000/retry",
    method: "post"
};

request(config)
    .then(res => {
        console.log('res ==> ', res.data);
    }).catch(err => {
        if (err.response) {
            console.log('err ==> ', err.response.data);
        } else {
            console.log('err ==> ', err.message);
        }
    });

测试结果

retyrCount ==> : 1
retyrCount ==> : 2
retyrCount ==> : 3
err ==>  { code: 500, message: 'error' }

重试流程

image

标签:Axios,请求,err,res,request,重试,retry,config,log
From: https://www.cnblogs.com/luyifo/p/18225946

相关文章

  • 淘宝API接口大全,实时数据接口且支持高并发请求不限制
    前言在开发测试阶段,或者是在写Demo的时候,难免会用到一些测试数据,有时苦于没有可用的接口,需要自己动手去写,但是这样大大降低了效率,前期我也找了一些封装好的接口,这篇文章整理一下,以下接口完全免费测试,返回格式全是JSON,所有接口均可无限制使用,有需要的小伙伴可以进来看看。 ......
  • webapi 设置swagger上请求参数的默认值
    1.创建一个Config文件夹,再文件夹下创建一个类,我这点取名DefaultValue.csusingMicrosoft.OpenApi.Any;usingMicrosoft.OpenApi.Models;usingSwashbuckle.AspNetCore.SwaggerGen;namespaceWebApiTest1.Config{publicclassDefaultValue:ISchemaFilter{......
  • request+pytest根据yaml文件发送请求
    request怎么跟pytest结合起来,然后根据yaml文件去发一个基本的请求呢?下面是一个简单的示例。1、先新建一个名为“demo.yaml”的yaml文件,用来存放测试数据的。-name:G广州研发中心parentid:1#第一次用例的数据正常expect:60008#对请求结果进行断言-nam......
  • nuxt3中$fetch方法delete请求不传body500报错
    后台delete请求参数写在query中,当只传query时报错500内部服务错误,后台断点进不去。但是当传入body请求体时接口正常进入。不知道什么原因多次尝试后发现。后台加入跨域或配置devProxy可解决问题.由于我是配置routeRules处理的跨域。如下nitro:{//devProxy:{//'/a......
  • springboot aop 通过参数名称来修改 get请求值
    引入aopimplementation'org.springframework.boot:spring-boot-starter-aop'代码实现`packagecom.photo.photoking.interceptor;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Asp......
  • PhantomCrawler:一款功能强大的多代理IP网站请求生成工具
    关于PhantomCrawlerPhantomCrawler是一款功能强大的多代理IP网站请求生成工具,该工具允许广大研究人员通过不同的代理IP地址来模拟与目标Web站点的交互行为。PhantomCrawler基于Python、requests和BeautifulSoup实现其功能,并提供了一种简单且高效的方法来测试不同代理配置下......
  • C# HTTP请求 get post
    C#HTTP请求getpostpublicclassHttpRequestHelper{publicstaticboolCheckValidationResult(objectsender,X509Certificatecertificate,X509Chainchain,SslPolicyErrorserrors){returntrue;}///&l......
  • for循环外创建一个http请求对象,循环内赋值参数多次请求返回数据相同定位及解决(共用一
    一次项目线上问题定位,发现多次不同参数请求值相同,直接上代码List<String>list=newArrayList<>();list.add("85657218,上海奉贤恒盛湖畔豪庭xxx号xxx");list.add("85657219,上海虹口虬江支路xxx弄xxx室");if(CollectionUtil.isNotEmpty(list))......
  • SpringBoot之ThreadLocal保存请求用户信息
    一、ThreadLocal概述 线程局部变量,创建一个线程变量后,针对这个变量可以让每个线程拥有自己的变量副本,每个线程是访问的自己的副本,与其他线程的相互独立。二、具体代码demo实现(1)创建user实例对象@DatapublicclassUserDTO{privateLonguserId;privateStringU......
  • axios 判断网络不通
    目录axios判断网络不通步骤1.安装axios2.发起网络请求语法参数返回值使用示例错误传播结论axios判断网络不通在前端开发中,我们经常会使用axios这个HTTP客户端库来进行网络请求。在实际开发中,有时候我们需要判断用户的网络是否通畅,以便进行相应的提示或......