import { authStore } from '@/stores/auth'
import type { R } from "@/types/r"
/***
统一拦截请求
**/
/** 请求的地址前缀 **/
const requestUrlPrefix = "http://m.xxx.com"
const authUserStore = authStore()
const TOKEN_WEB_PREFIX = "Bearer ";
const requestIntercept = {
// 之前触发
invoke(options : UniApp.RequestOptions) {
options.timeout = 10000
options.url = requestUrlPrefix + options.url
options.header = {
...options.header,
}
if (authUserStore.isLogin()) {
options.header.Authorization = TOKEN_WEB_PREFIX + authUserStore.getToken()
}
// console.log("invoke ", options);
}
}
// 普通请求
uni.addInterceptor("request", requestIntercept)
// 上传文件
uni.addInterceptor("uploadFile", requestIntercept)
// 2.2 添加类型,支持泛型
export const request = <T>(options : UniApp.RequestOptions) => {
// 1. 返回 Promise 对象
return new Promise<R<T>>((resolve, reject) => {
uni.request({
...options,
// 响应成功
success(res) {
// 状态码 2xx, axios 就是这样设计的
if (res.statusCode >= 200 && res.statusCode < 300) {
// 2.1 提取核心数据 res.data
const result = res.data as R<T>
if (result.code == 200) {
resolve(result)
} else if (401 == result.code) {
// 401错误 -> 可能是没登录或者token失效了 清理用户信息,跳转到登录页
authUserStore.reset()
uni.navigateTo({ url: '/pages/login/login' })
reject(res)
} else {
// 默认的错误提示, 401 不提示
if (!result.errorPromptMode) {
uni.showToast({
icon: 'none',
title: (res.data as R<T>).msg || '服务器繁忙,请稍后再试',
})
}
}
} else if (res.statusCode === 401) {
// 401错误 -> 可能是没登录或者token失效了 清理用户信息,跳转到登录页
authUserStore.reset()
uni.navigateTo({ url: '/pages/login/login' })
reject(res)
} else {
// 其他错误 -> 根据后端错误信息轻提示
uni.showToast({
icon: 'none',
title: (res.data as R<T>).msg || '服务器繁忙,请稍后再试',
})
reject(res)
}
},
// 响应失败
fail(err) {
uni.showToast({
icon: 'none',
title: '网络错误,换个网络试试',
})
reject(err)
},
})
})
}
薇图
- 发布:2023-09-26 17:59
- 更新:2024-03-06 17:39
- 阅读:337
1 个回复
钱缺缺
都没有人回答 我是Uncaught ReferenceError: uni is not defined