uni-helper / uni-network

为 uni-app 打造的基于 Promise 的 HTTP 客户端
https://uni-network.netlify.app
MIT License
76 stars 8 forks source link

响应拦截器的 rejected 如何触发 #54

Open tlerbao opened 2 months ago

tlerbao commented 2 months ago

描述问题

我尝试了几种方式都没能模拟触发到响应拦截器的 rejected 里。

比如我访问一个不存在的后端地址,产生跨域,也不会触发 rejected 里

此时后端返回的是没有 status 的下面的内容,现在怎么判断的严谨一点就不太会写了

CleanShot 2024-09-22 at 16 23 21@2x

复现

下面是我的响应拦截器代码,看前半部分的注释

this.service.interceptors.response.use(
      (response: UnResponse<any, any> & { config: CustomUnRequestConfig }) => {
        const { data, config, status } = response
       // 如果是上面说的跨域,没有 data 没有 config 没有 status 依然走fullfilled 部分
        const userStore = useUserStore()
        unCanceler.removePending(config)
        config.loading && uni.hideLoading()

        // 登录失效
        if (data.code === ResultEnum.OVERDUE) {
          userStore.setToken('')
          uni.redirectTo({ url: LOGIN_URL })
          uni.showToast({ title: data.message })
          return Promise.reject(data)
        }
        // 全局错误信息拦截(防止下载文件的时候返回数据流,没有 code 直接报错)
        if (data.code && data.code !== ResultEnum.SUCCESS) {
          uni.showToast({ title: data.message, icon: 'error' })
          return Promise.reject(data)
        }
        // 成功请求(在页面上除非特殊情况,否则不用处理失败逻辑)
        return data
      },
      async (error: UnError) => {
        const { response } = error
        uni.hideLoading()
        // 根据服务器响应的错误状态码,做不同的处理
        if (response) checkStatus(response.status)
        return Promise.reject(error)
      },
    )

系统信息

uni network

使用的包管理器

pnpm

核对

贡献

tlerbao commented 2 months ago

我又测试了一下,发现在 h5 下是走不到rejected,但是在小程序下是会正常走到的

ModyQyW commented 1 month ago

自带的适配器会在 complete 里面调用 settle https://github.com/uni-helper/uni-network/blob/main/packages/core/src/adapters/request.ts#L63-L82

再在 settle 里面调用 resolve 或者 reject https://github.com/uni-helper/uni-network/blob/main/packages/core/src/core/settle.ts

settle 代码和 axios 一致

ModyQyW commented 1 month ago

另见 https://github.com/uni-helper/uni-network/issues/49