vue3+ts+vite axios封装请求并扩展入参

requset.ts

javascript 复制代码
import axios, { AxiosResponse } from 'axios'
import { getToken, removeToken } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
  baseURL: '', // 所有的请求地址前缀部分(没有后端请求不用写)
  timeout: 60000 // 请求超时时间(毫秒)
  // withCredentials: true // 异步请求携带cookie
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    const token = getToken() || ''
    // 如果你要去localStor获取token,(如果你有)
    if (token) {
      // 设置 token 请求头
      config.headers['csg-token'] = token
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    if (response.config.handleResponse) {
      return response
    } else {
      const { code, msg } = response.data
      if (+code === 0) {
        return response.data
      } else if (+code === 59990001) {
        ElMessage.error('token过期请重新登陆!')
        return new Promise((_resolve, reject) => {
          reject(response.data)
          removeToken()
        })
      } else {
        ElMessage.error(response.data.msg)
        if (response.config.handleError) {
          return Promise.reject(response.data)
        } else {
          return Promise.reject(msg || '未知错误')
        }
      }
    }
  },
  (error) => {
    ElMessage.error(error.message)
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)
export default service

api.ts文件进行接口请求

javascript 复制代码
export function excelExportArrivalGoods(data: any) {
  return request({
    url: settings.taskPrefix + '/adm/arrivalGoods/excel-export',
    method: 'post',
    data,
    handleResponse: true,
    responseType: 'blob'
  })
}

会发现handleResponse参并不在axios提供的类型中

解决办法就是扩展 AxiosResponse接口参数在request.ts页面中加入

javascript 复制代码
declare module 'axios' {
  export interface AxiosRequestConfig {
    handleResponse?: boolean // 可以根据需要设置为其他类型
    handleError?: boolean // 同理,根据需要设置
    // ... 其他自定义属性
  }
}

最后发现api也不报红了

完整的代码

javascript 复制代码
import axios, { AxiosResponse } from 'axios'
import { getToken, removeToken } from '@/utils/auth'
// 扩展 AxiosRequestConfig 以包含 handleResponse 属性
declare module 'axios' {
  export interface AxiosRequestConfig {
    handleResponse?: boolean // 可以根据需要设置为其他类型
    handleError?: boolean // 同理,根据需要设置
    // ... 其他自定义属性
  }
}
// 创建axios实例
const service = axios.create({
  baseURL: '', // 所有的请求地址前缀部分(没有后端请求不用写)
  timeout: 60000 // 请求超时时间(毫秒)
  // withCredentials: true // 异步请求携带cookie
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    const token = getToken() || ''
    // 如果你要去localStor获取token,(如果你有)
    if (token) {
      // 设置 token 请求头
      config.headers['csg-token'] = token
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    if (response.config.handleResponse) {
      return response
    } else {
      const { code, msg } = response.data
      if (+code === 0) {
        return response.data
      } else if (+code === 59990001) {
        ElMessage.error('token过期请重新登陆!')
        return new Promise((_resolve, reject) => {
          reject(response.data)
          removeToken()
        })
      } else {
        ElMessage.error(response.data.msg)
        if (response.config.handleError) {
          return Promise.reject(response.data)
        } else {
          return Promise.reject(msg || '未知错误')
        }
      }
    }
  },
  (error) => {
    ElMessage.error(error.message)
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)
export default service
相关推荐
桂月二二5 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
CodeClimb6 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
沈梦研6 小时前
【Vscode】Vscode不能执行vue脚本的原因及解决方法
ide·vue.js·vscode
hunter2062066 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb6 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角6 小时前
CSS 颜色
前端·css
轻口味7 小时前
Vue.js 组件之间的通信模式
vue.js
九酒7 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae
浪浪山小白兔7 小时前
HTML5 新表单属性详解
前端·html·html5
lee5768 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm