创建请求实例
()
| 7 | |
| 8 | /** 创建请求实例 */ |
| 9 | function createService() { |
| 10 | // 创建一个 axios 实例命名为 service |
| 11 | const service = axios.create() |
| 12 | // 请求拦截 |
| 13 | service.interceptors.request.use( |
| 14 | (config) => config, |
| 15 | // 发送失败 |
| 16 | (error) => Promise.reject(error) |
| 17 | ) |
| 18 | // 响应拦截(可根据具体业务作出相应的调整) |
| 19 | service.interceptors.response.use( |
| 20 | (response) => { |
| 21 | // apiData 是 api 返回的数据 |
| 22 | const apiData = response.data |
| 23 | // 二进制数据则直接返回 |
| 24 | const responseType = response.request?.responseType |
| 25 | if (responseType === "blob" || responseType === "arraybuffer") return apiData |
| 26 | // 这个 code 是和后端约定的业务 code |
| 27 | const code = apiData.code |
| 28 | // 如果没有 code, 代表这不是项目后端开发的 api |
| 29 | if (code === undefined) { |
| 30 | // ElMessage.error("非本系统的接口") |
| 31 | // return Promise.reject(new Error("非本系统的接口")) |
| 32 | return apiData |
| 33 | |
| 34 | } |
| 35 | switch (code) { |
| 36 | case 200: |
| 37 | // 本系统采用 code === 0 来表示没有业务错误 |
| 38 | return apiData |
| 39 | default: |
| 40 | // 不是正确的 code |
| 41 | ElMessage.error(apiData.message || "Error") |
| 42 | return Promise.reject(new Error("Error")) |
| 43 | } |
| 44 | }, |
| 45 | async (error) => { |
| 46 | const { refreshToken, logout } = useUserStoreHook() |
| 47 | // status 是 HTTP 状态码 |
| 48 | const status = get(error, "response.status") |
| 49 | const message = get(error, "response.data.message") |
| 50 | switch (status) { |
| 51 | case 400: |
| 52 | error.message = message ?? "请求错误" |
| 53 | break |
| 54 | case 401: |
| 55 | error.message = message |
| 56 | if (error.config.url != '/login/refresh') { |
| 57 | const res = await refreshToken(); |
| 58 | if (res.success) { |
| 59 | setTimeout(() => { |
| 60 | let config = error.config; |
| 61 | config.headers.Authorization = res.data.access_token; |
| 62 | Promise.resolve(service(error.config)); |
| 63 | }, 30); |
| 64 | } else { |
| 65 | Promise.reject(res) |
| 66 | } |
no test coverage detected