美文网首页
axios请求成功进入catch原因

axios请求成功进入catch原因

作者: lazy_tomato | 来源:发表于2020-09-25 17:41 被阅读0次

START

  • 仅以此文,纪念这个离谱的bug,o(╥﹏╥)o

问题

  • 长话短说,使用axios进行请求,浏览器f12检查,请求成功。但是代码逻辑还是进入axios的catch模块。

原因

  1. 当axios请求完成后走的是then的代码块,如果then代码块中存在错误代码信息,这时就会进入catch中>抛出异常(注意:此时控制台并不会报错,因为错误被catch捕获了)
  1. axios是异步发起,若发起后页面刷新,那么就会丢失当前进程,导致接收不到。例如 form表单,点击>按钮提交后,表单会刷新

特殊情况

  • 上述两种原因,结合自身代码,基本上就可以找到问题并解决了,但是还有一种特殊情况,听我细细道来。

踩坑记录

  1. 长话短说,使用axios进行请求音频二进制数据流,浏览器f12检查,请求成功。但是代码逻辑还是进入axios的catch模块。

    效果见下图:

    blob数据.png
  • 猜测一:是不是请求代码写的有问题?
    • 一开始我就检查自己的代码,是不是请求代码写的有问题。经过检查,别的请求都是没有问题的,请求都成功也不会进入catch模块。 唯独我这接口请求成功,还是进catch(pass
  • 猜测二:是不是 .then 代码块中存在错误代码
    • .then 中就一个 console.log() (pass)
  • 猜测三:是不是页面刷新了
    • 经过很仔细的检查判断,不存在表单,不存在页面刷新。(pass
  • 猜测四:是不是请求二进制数据流没有添加响应类型
    • 添加了 responseType:'blob' ,但是还是会进入catch (pass

解决方案

  • 由于项目是同事封装的axios

  • 在axios中 添加了响应拦截器

    • 代码如下
    axios.interceptors.response.use(
      response => {
    if (res.code !== 'ok') {
          if (response.headers['content-type'].search('octet-stream') > -1) {
            return response;
          }
          Message({
            message: res.message || 'Error',
            type: 'error',
            duration: 4 * 1000
          });
          return Promise.reject(new Error(res.message || 'Error'));
        } else {
          return response;
        }
    }
    

    解释一下:经过排查,同事二次封装了axios,会判断返回的 res数据 是否包含 code === ‘ok’

    若包含,则会 return resolve() (进入 .then)

    若不包含。则会进入上述if 语句

    因为二进制数据流,直接返回的就是二进制数据流,不包含res.code。所以会进入 上面代码的if

    if (response.headers['content-type'].search('octet-stream') > -1) {
    return response;
    }

    这句话会判断后端返回的http中的header : ‘content-type' 信息 ,用于对二进制流数据情况进行处理。判断是否包含特殊标识,包含则不进入catch,不包含则进入。

解决方案:

  • 后端添加 content-type

相关文章

  • axios请求成功进入catch原因

    START 仅以此文,纪念这个离谱的bug,o(╥﹏╥)o 问题 长话短说,使用axios进行请求,浏览器f12检...

  • axios 请求成功还会进入catch

    axios请求完成后,如果then代码块中存在错误代码信息(比如取数据没取到),就会进入catch中抛出异常。(注...

  • axios在uniapp中的使用

    参考资料:axios在vue中的封装axios请求数据获取成功了,但没有走then而是走了catch

  • axios 拦截器

    //在请求或响应被 then 或 catch 处理前拦截它们axios.interceptors.request....

  • 实现像 axios 一样的请求拦截器

    axios 拦截器在请求或响应被 then、catch 之前进行拦截处理。 axios 的三大特性:基于 Prom...

  • axios拦截器

    拦截器 在请求或响应被then或catch处理前拦截它们。 // 添加请求拦截器 axios.intercepto...

  • vue中ajax请求时配置请求路径

    在终端中 安装axios 安装成功以后再需要axios请求的页面导入 设置请求.为了避免在上线之前改动请求地址,我...

  • axios等请求中catch说明

    在then中处理数据、调用其他方法,如果抛错的话,这些错误会被catch到,并执行里面的内容。 此处axios向后...

  • axios的post请求,后台拿不到参数

    一、axios的post请求方式 第一种 第二种 具体文档参考Axios中文说明 二、导致原因 具体原因可以在请求...

  • axios 代理服务器

    npm i axios 下载 import axios from 'axios' 引入 发送请求axios请求 跨...

网友评论

      本文标题:axios请求成功进入catch原因

      本文链接:https://www.haomeiwen.com/subject/kwwfuktx.html