首页 > 其他分享 >记一次重试机制和服务器响应慢导致的异常

记一次重试机制和服务器响应慢导致的异常

时间:2023-08-18 17:25:34浏览次数:41  
标签:200 res 重试 响应 AOP 服务器 Array data

先说下异常是什么:正常情况下,我们的数据,axios返回后都是在res.data中的,于是项目里面常见的就是来个响应拦截,然后返回res.data。

现在重试机制 + 服务器响应慢,会导致最后返回的数据直接就是res.data里面的内容了,你再.data,自然就有问题了

解决:判断是否是axiosResponse对象,如果是,正常返回res.data,如果不是,直接返回res(现阶段:重试的请求得到的结果和之前超时请求的结果一样的)

过程分析:

1.正常请求

先看下正常请求的日志输出:res是axiosResponse对象

------------------------
request AOP 1692346964543 {transitional: {…}, adapter: Array(2), transformRequest: Array(1), transformResponse: Array(1), timeout: 5000, …}
Response AOP res: {data: {…}, status: 200, statusText: 'OK', headers: AxiosHeaders, config: {…}, …}
Response AOP HttpStatus: 200 | JDStatus 200
------------------------
weightVolumeUpload {barCode: 'JD11', code: 200, message: 'OK'}

正常

2.请求超时

再请求一次的时候超时了(服务器响应慢)触发了重试机制

------------------------
request AOP 1692346973680 {transitional: {…}, adapter: Array(2), transformRequest: Array(1), transformResponse: Array(1), timeout: 5000, …}
retry touch: AxiosError {message: 'timeout of 5000ms exceeded', name: 'AxiosError', code: 'ECONNABORTED', config: {…}, request: XMLHttpRequest, …}
retryCount: 1

3.过多响应

然后服务器又很快反应了,还把上次超时的数据也给我返回了。。。

------------------------
request AOP 1692346980593 {transitional: {…}, adapter: Array(2), transformRequest: Array(1), transformResponse: Array(1), timeout: 5000, …}
Response AOP res: {data: {…}, status: 200, statusText: 'OK', headers: AxiosHeaders, config: {…}, …}
Response AOP HttpStatus: 200 | JDStatus 200
------------------------
Response AOP res: {barCode: 'JD11', code: 200, message: 'OK'}
Response AOP HttpStatus: undefined | JDStatus undefined
------------------------

4.响应处理

但是,Ajax的地方,只收到服务器返回的最后一次数据。类型不是axiosResponse的,而是直接就是服务器返回的数据:

weightVolumeUpload {barCode: 'JD11', code: 200, message: 'OK'}

过程如图所示:

axios请求得到的数据一般都会放在res.data里面,响应拦截一般会返回一个res.data,现在我们可能会遇到直接返回data的情况,我是这样暂时处理的:(这两次服务器返回结果其实一样

每个AxiosResponse对象都会有个res.status属性,服务器端返回的数据没有这个属性名字是code(你后端返回也有个status就不能这么判断,可以通过实例对象判断,也可以通过其他属性判断)

5.附录

// 响应拦截
myAxios.interceptors.response.use(res => {
    console.debug("Response AOP res:", res);
    console.debug("Response AOP HttpStatus:", res?.status, '| JDStatus', res?.data?.code);
    console.debug("------------------------");
    // 是AxiosResponse对象才是我要的东西
    if (res.hasOwnProperty('status')) { // 这个逻辑你要根据你后端返回微调
        return res.data;
    } else {
        return res; // 返回对象不是AxiosResponse,这个res就相当于是res.data里面的数据了
    }
}, error => {
    return Promise.reject(error);
})

重试机制:

axiosRetry(myAxios, {
    retries: 3, // 重试次数  
    retryDelay: (retryCount) => {
        console.debug('retryCount:', retryCount);
        return retryCount * 1000; // 重试时间累加,可以写1500
    },
    shouldResetTimeout: true, // 每次重试都重置超时时间
    // 自定义条件,针对状态为500、1000、超时、网络问题进行重试
    retryCondition: (error) => {
        console.debug('retry touch:', error);
        return error?.response?.status === 500 || // JD服务器内部错误
            error?.response?.status === 1000 || // JD服务器内部错误
            error?.code === 'ECONNABORTED' || // 后端响应超时☆
            error?.code == 'ERR_NETWORK'; // 网络异常
    },
});

重试机制

标签:200,res,重试,响应,AOP,服务器,Array,data
From: https://www.cnblogs.com/dotnetcrazy/p/17641007.html

相关文章

  • 搭建内网服务器
    luogu链接正文//httpServer.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<windows.h>#include<io.h>#include<bits/stdc++.h>//要使用网络编程,要包含系统给我们提供的头文件#include<winsock2.h>#pragmacomment(lib,"ws2_32.lib")usingn......
  • 微服务14:微服务治理之重试
    ★微服务系列微服务1:微服务及其演进史微服务2:微服务全景架构微服务3:微服务拆分策略微服务4:服务注册与发现微服务5:服务注册与发现(实践篇)微服务6:通信之网关微服务7:通信之RPC微服务8:通信之RPC实践篇(附源码)微服务9:服务治理来保证高可用微服务10:系统服务熔断、限流微服务11......
  • 游戏工作室如何使用代理服务器防封
    嘿,各位游戏工作室的小伙伴们!作为一名专业的程序员,我今天要和大家分享一个有关代理服务器的技巧,这个技巧可以帮助你们解决封号和封禁的问题。首先,我们得明白为什么要使用代理服务器来解决封号和封禁的问题。在我们搬砖的过程中,游戏运营商会对频繁请求的IP进行限制,导致我们的账号被封......
  • 内网服务器离线编译安装mysql5
    目录一.前言二.关于MySQL三.MySQL安装篇3.1部署环境3.2前期准备工具3.3挂载系统ISO镜像,配置yum源3.4安装mysql编译所需的依赖包3.5源码编译安装mysql5.73.6配置mysql四.MySQL调优篇4.1对MySQL进行安全设置4.2设置MySQL超时时间4.3MySQL配置文件优化参......
  • 恒创科技:香港服务器备案会通过吗?
    ​对于企业或个人来说,合规备案是网络运营的基本要求,也是保护自身权益的重要举措。以下内容围绕备案展开话题,希望为您解开疑惑。香港服务器备案会通过吗?目前,香港服务器无法备案,这是由于国内管理规定的限制。在备案申请过程中,需要绑定国内大陆服务器IP,而香港服务器IP......
  • 本地电脑做服务器搭建web站点并公网访问「内网穿透」
    @[TOC]转载自远程源码文章:【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透」1.前言在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助,比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类,为方便用户使用,还出现了XAMPP、PHPStudy、宝塔面板等等一系列集......
  • 鸟哥的Linux私房菜服务器架设篇
    第十五章时间服务器:NTP服务器1、会有统一的NTP服务器来保证每个地区/国家的统一时间;2、时间相关的概念:   a、格里尼治时间(GreenwichMeanTime);   b、UTC(CoordinatedUniversalTime);3、UTC时间与GMT时间有差不多16分钟的误差;4、Linux系统本来就有两种时间,一种是Linu......
  • windows域控服务器导出证书
    【1】windows证书导出(1.1)方法1:certmgr.msc开始=》运行=》certmgr.msc 可以从左侧目录查找证书,也可以搜索查找证书。本文使用搜索查找证书:按照提示下一步下一步即可 (1.2)方法2:mms开始=》运行=》mmc  :打开了控制台文件=》添加/删除管理单元弹出的......
  • JAVA SSH 连接服务器 去指定目录 检查文件 并读取json文件内容
    要使用JavaSSH连接服务器并检查文件,可以使用JSch库。以下是一个示例代码:importcom.jcraft.jsch.*;​importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;​publicclassSSHExample{publicstaticvoidmain(String[]ar......
  • 爬虫设置代理服务器和端口:轻松搞定网络爬虫的必备技巧!
    亲爱的爬虫爱好者,咱们在网络爬虫之旅中,设置代理服务器和端口是必不可少的一环。今天,作为一名http代理产品供应商,我将与你分享如何轻松地设置代理服务器和端口,助你在爬虫世界中获得更高的成功率。一、为什么要设置代理服务器和端口?在进行网络爬虫时,有些网站对频繁的请求......