vite热更新时,页面自动http请求报错的问题

描述

vite + axios

页面修改代码后, vite进行热更新, 当onMounted中进行了http请求, 请求时报错

原因

封装axios时, 设置响应拦截器, 当返回了res.data时, 下一次热更新时, 进入响应拦截器的对象就是res.data对象, 而非res对象

ty 复制代码
axios.interceptors.response.use(
  (res: AxiosResponse<any, any>) => {
    return new Promise((resolve, reject) => {
      // 状态码判断....

      return resolve(res)
      // return resolve(res.data)		// 返回res.data会导致热更新后接口请求报错
    })
  },
	(error) => {
    console.error('>>> response error', error)
    // 响应码判断....
   
    return Promise.reject(error)
  }
)

解决

axios响应拦截器中直接返还res对象

在调用api函数后就需要多一层解析过程

可以再封装一个请求对象, 函数中返还res.data, 示例:

复制代码
const http = {
  get(url, params) {
    return new Promise((resolve, reject) => {
      NProgress.start()
      axios
        .get(url, { params })
        .then((res) => {
          NProgress.done()
          resolve(res.data)
        })
        .catch((err) => {
          NProgress.done()
          reject(err)
        })
    })
  },
  post(url, params) {
    return new Promise((resolve, reject) => {
      NProgress.start()
      axios
        .post(url, params)
        .then((res) => {
          NProgress.done()
          resolve(res.data)
        })
        .catch((err) => {
          NProgress.done()
          reject(err)
        })
    })
  },
  put(url, params, removeId = true) {
    // 移除params中的ID字段
    if (removeId && params.id) {
      params.id = undefined
    }
    return new Promise((resolve, reject) => {
      NProgress.start()	// 进度条插件, 可以删除
      axios
        .put(url, params)
        .then((res) => {
          NProgress.done()
          resolve(res.data)
        })
        .catch((err) => {
          NProgress.done()
          reject(err)
        })
    })
  },
  delete(url) {
    return new Promise((resolve, reject) => {
      NProgress.start()
      axios
        .delete(url)
        .then((res) => {
          NProgress.done()
          resolve(res.data)
        })
        .catch((err) => {
          NProgress.done()
          reject(err)
        })
    })
  },
}

// 使用
const api = {
  // 登录
  login: (params) => http.post('/api/v1/base/login', params),
}

api.login({...参数}).then((resData) => {})
相关推荐
Setsuna_F_Seiei1 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
zhangzeyuaaa2 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙3 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯3 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
一个风轻云淡4 小时前
GCC 和 GDB命令简单解读
java·linux·前端
u0111026755 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说5 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
libokaifa5 小时前
把语音模型塞进手机:sherpa-onnx 在 Android 上的 ASR / TTS
前端
deli0076 小时前
DLA 枝晶生长实测:5000 个粒子集体停摆之后,分形维数收敛到 1.70
前端
IT_陈寒6 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端