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
相关推荐
Z_ One Dream16 分钟前
css 在 hover 子元素时,不要让父元素触发 hover 效果
前端·javascript·css
码农幻想梦5 小时前
实验九 视图的使用
前端·数据库·oracle
开心工作室_kaic7 小时前
ssm010基于ssm的新能源汽车在线租赁管理系统(论文+源码)_kaic
java·前端·spring boot·后端·汽车
Python私教7 小时前
Flutter颜色和主题
开发语言·javascript·flutter
大力水手~8 小时前
css之loading旋转加载
前端·javascript·css
Nguhyb8 小时前
-XSS-
前端·xss
前端郭德纲8 小时前
深入浅出ES6 Promise
前端·javascript·es6
就爱敲代码8 小时前
ES6 运算符的扩展
前端·ecmascript·es6
天天进步20159 小时前
Lodash:现代 JavaScript 开发的瑞士军刀
开发语言·javascript·ecmascript
王哲晓9 小时前
第六章 Vue计算属性之computed
前端·javascript·vue.js