wujingjing
2024-08-12 a2410e6dd7dfe33133e709e43b06b3bb7852d4b1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// 导入模块、包提供的类
import WxRequest from 'mina-request'
// 导入封装的本地存储操作模块
import { getStorage, clearStorage } from './storage'
// 导入封装的增强 API
import { toast, modal } from './extendApi'
//#region ====================== 后端 res.err_code ======================
export const ErrorCode = {
  /** @description 权限验证失败 */
  Message: 'MESSAGE',
  /** @description 内部错误 */
  Exception: 'EXCEPTION',
  /** @description 无权使用 */
  Auth: 'AUTH',
}
//#endregion
 
export const checkAuth = () => {
  const session = getStorage('session');
  if (!session) {
    // 既然用户需要重新进行登录,就需要把之前用户存储的信息(过期的 token) 进行清除
    clearStorage()
    wx.reLaunch({
      url: '/pages/login/login'
    })
  }
  return !!session;
}
 
 
const debounceCheckAuth = wx.$_.debounce(checkAuth);
// 对类进行实例化
const instance = new WxRequest({
  baseURL: 'https://wi.cpolar.top',
  timeout: 15000
})
 
instance.defaults.header['content-type'] = 'application/x-www-form-urlencoded'
 
// 添加请求拦截器 (在请求发送之前对请求参数进行新增或者修改)
instance.interceptors.request = (config) => {
  // 在实际开发中,有一些接口需要使用访问令牌 session
  // 访问令牌 session 通常是存储到本地
  // 需要先从本地获取到存储的 session
  const session = getStorage('session')
 
  // 如果本地存在 session,这时候就需要在请求头中添加 session 字段
  if (session) {
    config.header['hswatersession'] = session
  } else {
    // 需要权限验证接口
    if (!config.noAuth) {
      debounceCheckAuth();
    }
  }
 
  // 在发送请求之前做些什么
  return config
}
 
// 添加响应拦截器 (在服务器响应数据以后,对返回的数据进行逻辑处理)
instance.interceptors.response = async (response) => {
  // 从 response 对象中解构两个数据
  const { isSuccess, data } = response
 
  // response 服务器响应的数据,只不过数据被 wx.request 进行了一层包装
  // console.log(response)
 
  // response.config 封装的包里面提供的 config 属性,是请求的参数信息
  // 可以使用请求参数进行代码的调试
 
  // response.data 服务器真正响应的数据
 
  // response.isSuccess 判断代码执行了哪一个回调函数
  // isSuccess = true,说明代码执行了 wx.request 方法的 success 回调函数
  // isSuccess = false,说明代码执行了 wx.request 方法的 fail 回调函数
 
  // 如果 isSuccess = false,说明网络出现了问题
  if (!isSuccess) {
    toast({
      title: '网络异常请重试',
      icon: 'error'
    })
 
    return Promise.reject(response)
  }
 
  // 如果 isSuccess = true,说明代码执行到了 success 回调函数
  // 需要开发者对返回的参数进行逻辑判断
  // 需要对后端返回的业务状态码进行判断
  // 业务状态码 === 200,接口调用成功,服务器成功返回了数据
  // 业务状态码 === 208,没有 token 或者 token 失效,需要让用户重新进行登录
  // 业务状态码既不等于 200,也不等于 208,说明出现了其他异常,需要给用户统一进行提示
  if (!data.json_ok) {
    switch (data?.err_code) {
 
      case ErrorCode.Auth:
        clearStorage()
        wx.redirectTo({
          url: '/pages/login/login'
        })
        return Promise.reject(response)
 
      case ErrorCode.Exception:
        toast({ title: '内部错误' });
        return Promise.reject(response)
 
      // case 200:
      //   // 接口调用成功,服务器成功返回了数据,只需要将数据简化以后返回即可
      //   return data
 
      default:
        // toast({
        //   title: '程序出现异常,请联系客服或稍后重试!'
        // })
        // return Promise.reject(response)
        return data;
 
    }
  }
 
  return data
}
 
// 导出实例
export default instance