避免在每个请求中使用 Axios 在 Vue 中响应错误时进行处理

Posted

技术标签:

【中文标题】避免在每个请求中使用 Axios 在 Vue 中响应错误时进行处理【英文标题】:Avoid handling if error has response in Vue with Axios in every request 【发布时间】:2021-12-02 13:18:20 【问题描述】:

我使用 axios 拦截器来处理一些错误,特别是没有响应的错误。在我项目的某些部分,我使用 error.response.data 中包含的消息进行验证并显示存储在后端的消息。但是这个拦截器并没有阻止我检查错误是否有响应。

我的拦截器:

axios.interceptors.response.use(
    function (response) 
      ...
    ,
    function (error) 
      if (!error.response) 
        ...
        return Promise.reject(new Error(error.message))
      

一个依赖于error.response的请求示例:

this.$store.dispatch('updateField',  [this.fieldKey]: this.value ? this.value : null ).catch((error) => 
        this.validateField(error.response.data)
      )

但我必须将 validateField 调用放在 if(eror.response) 中以避免控制台中的错误,并将其传播到我的代码中?

【问题讨论】:

【参考方案1】:

response 可以视为可选,因为它实际上是:

this.validateField(error.response?.data)

或者可以在拦截器中创建包含所需属性且不依赖于 Axios 错误结构的规范化错误:

function (rawError) 
  const error = new Error(error.response?.data?.myError || error.message);
  error.data = error.response?.data || null;
  error.headers = error.response?.headers || null;
  error.status = error.response?.status || 0;
  return Promise.reject(error);

【讨论】:

以上是关于避免在每个请求中使用 Axios 在 Vue 中响应错误时进行处理的主要内容,如果未能解决你的问题,请参考以下文章

ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

Vue路由切换&Axios接口取消重复请求

Axios-一次发出多个请求(vue.js)

vue2项目使用axios发送请求

vue2项目使用axios发送请求

Vue:axios中POST请求传参问题---传递数组 (补充)