vue3 ts axios请求封装,取消请求,失败重发,权限控制问题

 更新时间:2026年05月18日 10:35:37   作者:瑕疵​  
该文介绍了使用TypeScript处理前后端交互常见问题的工具,通过将token添加至请求头、增加超时请求重试、添加请求取消功能等措施,统一处理网络连接不稳定、请求超时等异常情况,提高代码质量和维护性

vue3 ts axios请求封装,取消请求,失败重发,权限控制

用了 TypeScript 进行全面支持

针对前后端交互常见问题进行了细致的处理,包括将 token 添加至请求头、增加超时请求重试、添加请求取消功能等等。

此外,该工具还提供了统一的异常处理机制,对于常见的网络连接不稳定、请求超时等异常情况,能够快速准确地进行处理。

使用该工具

可以提高代码质量和可维护性

import axios, { AxiosRequestConfig, CancelTokenSource } from 'axios'
import { ElMessage } from 'element-plus';
//用于报错
import config from "@/config/projectOptions"
//项目整体配置
import router from "@/router";
//权限跳转
interface AxiosRequestConfigExtended extends AxiosRequestConfig {
  retry: number
  retryDelay: number
}
axios.defaults.baseURL = config.baseUrl//url
const timeout = 5000//超时时间
let timer: number//用于延时重发请求
const request = axios.create({
  timeout,
  retry: 0, // 重试次数
  retryDelay: timeout // 重试间隔 
} as AxiosRequestConfigExtended);

request.interceptors.request.use(config => {
  config.headers && (config.headers.token = sessionStorage.getItem('token') || "")//填写token
  timer = window.setTimeout(() => {
    config.cancelToken = axios.CancelToken.source().token//用于取消请求
  }, timeout)
  return config
  // 对响应数据做点什么
}, function (error) {
  clearTimeout(timer)//错误后清除延时
  // 对响应错误做点什么
  throw error
});

request.interceptors.response.use(res => {
  if (res.status === 200 && res.data.ok) {//状态判断
    return res.data//正常返回
  } else {
    errorHandle({ response: res })//异常集中处理
    return Promise.reject({ message: 'Unknown response format' });//报错提示格式错误
  }
  // 对响应数据做点什么
}, async function (error) {
  // 对响应错误做点什么
  if (!error.config || !error.config.retry || error.response.data) {
    return errorHandle(error)
  }
  error.config.retry -= 1//记录请求
  await new Promise((resolve) => {
    setTimeout(() => {
      resolve("");
    }, error.config.retryDelay);
  })
  //等待请求重发
  return request(error.config)
});

// 错误处理
function errorHandle(error: any) {
  let message = ""
  //报错处理
  if (error.response.data) { //格式判断
    if ([401, 403].indexOf(error.response.status) > -1) {
      // 对于未授权或权限不够的错误,直接跳转到登录页面
      message = '登录过期,请重新登录'
      setTimeout(() => {
        sessionStorage.clear()
        router.replace({ path: "Login" })
      }, 1000)
    } else if (error.response.data.code) {
      if ([522, 523].indexOf(error.response.data.code) > -1) {
        // 对于未授权或权限不够的错误,直接跳转到登录页面
        message = error.response.data.message
        setTimeout(() => {
          sessionStorage.clear()
          router.replace({ path: "Login" })
        }, 1000)
      } else {
        message = message = error.response.data.message
      }
    } else if (error.message === "Network Error") {
      message = "网络连接已断开,请检查网络"
    } else if (error.message === `timeout of ${timeout}ms exceeded`) {
      message = "请求超时,请检查网络"
    } else if (error.message.indexOf('timeout') > -1) {
      message = "服务器响应超时,请重试"
    } else {
      message = error.message
    }
  } else {
    message = "请求失败,请稍后重试"
  }
  ElMessage.error(message)
  return Promise.reject(error);
}

export default {
//导出get方法 传入cancel用于取消请求
  get: (url: string, params?: any, cancel?: CancelTokenSource) => request.get(url, {
    params,
    cancelToken: cancel ? cancel.token : undefined
  }),
  //用于post传入数据识别params||body
  post: (url: string, data?: { params?: any, data?: any }, cancel?: CancelTokenSource) => request.post(url, data?.data, {
    params: data?.params,
    cancelToken: cancel ? cancel.token : undefined
  }),
  //导出删除
  delete: (url: string, params?: any, cancel?: CancelTokenSource) => request.delete(url, {
    params,
    cancelToken: cancel ? cancel.token : undefined
  })
  //可自行增加
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue3 中的  shallowReactive 详解

    Vue3 中的  shallowReactive 详解

    本文深入探讨了Vue3中新特性shallowReactive的使用和原理,shallowReactive是创建浅响应式对象的API,只对对象的第一层属性进行响应式转换,不对嵌套对象处理,有助于性能优化和状态管理,同时也指出了shallowReactive在使用中的注意事项
    2024-10-10
  • Vue.js 2.x之组件的定义和注册图文详解

    Vue.js 2.x之组件的定义和注册图文详解

    组件Component是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码,这篇文章主要介绍了Vue.js 2.x:组件的定义和注册,需要的朋友可以参考下
    2018-06-06
  • vue axios请求频繁时取消上一次请求的方法

    vue axios请求频繁时取消上一次请求的方法

    这篇文章主要介绍了vue axios请求频繁时取消上一次请求的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • vue3+Ts使用pinia方式(vue-lic搭建项目)

    vue3+Ts使用pinia方式(vue-lic搭建项目)

    文章介绍了如何在Vue 3项目中使用Pinia进行状态管理,主要内容包括安装Pinia、初始化、在main.ts中注册和使用,以及在.vue的setup中使用state,文章还提到getters和actions的使用可以参考官方文档,总结部分表达了作者希望得到大家支持的意愿
    2025-01-01
  • vue+ts实现元素鼠标拖动效果

    vue+ts实现元素鼠标拖动效果

    这篇文章主要为大家详细介绍了vue+ts实现元素鼠标拖动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue3监听reactive对象中属性变化的方法

    Vue3监听reactive对象中属性变化的方法

    在 Vue 3 中,如果你想监听 reactive 对象中的某个属性发生的变化,你可以使用 watch 函数进行监听,watch 函数允许你观察 reactive 对象的某个属性或者整个对象,所以本文给大家介绍了Vue3监听reactive对象中属性变化的方法,需要的朋友可以参考下
    2024-08-08
  • vue cli3 配置proxy代理无效的解决

    vue cli3 配置proxy代理无效的解决

    今天小编就为大家分享一篇vue cli3 配置proxy代理无效的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • VUE3中watch监听使用实例详解

    VUE3中watch监听使用实例详解

    watch函数用来侦听特定的数据源,并在回调函数中执行副作用,下面这篇文章主要给大家介绍了关于VUE3中watch监听使用的相关资料,需要的朋友可以参考下
    2022-06-06
  • vuejs2.0运用原生js实现简单的拖拽元素功能示例

    vuejs2.0运用原生js实现简单的拖拽元素功能示例

    本篇文章主要介绍了vuejs2.0运用原生js实现简单的拖拽元素功能示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • vue实现图片按比例缩放问题操作

    vue实现图片按比例缩放问题操作

    这篇文章主要介绍了vue实现图片按比例缩放问题操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论