
产生原因
获取的token有时效性且不会自动刷新,为了方便封装在请求文件中
需求是不能重新登录而且后端不处理
基本逻辑
本文根据请求后返回状态判断是否过期,过期则刷新,规定401为token失效
在刷新token过程中不进入失败回调
刷新后重新请求并返回数据
代码实现
import { getToken } from '@/api'
import { request } from 'http'
let isRefreshing = false
let requests = []
module.exports = (vm) => {
uni.$u.http.setConfig((config) => {
config.custom = {
auth: true,
toast: true,
catch: true,
}
config.timeout = 8000
return config
})
uni.$u.http.interceptors.request.use(
(config) => {
config.baseURL = 'https://...'
config.data = config.data || {}
if (config.custom.auth) {
config.header.Authorization = vm.vuex_token
}
return config
},
(config) => {
return Promise.reject(config)
}
)
uni.$u.http.interceptors.response.use(
(response) => {
const data = response.data
if (!data.data || !data.stauts){
const custom = response.config.custom
if (custom.toast) uni.$u.toast(data.message || '请求超时或服务器异常')
if (custom.catch) return Promise.reject(data)
else return new Promise(() => {})
}
return data.data ? data.data : data
},
async (response) => {
switch (response.statusCode) {
case 401:
if (!isRefreshing) {
isRefreshing = true
await getToken()
requests.forEach(async ({ fn, resolve }) => {
const res = await fn()
resolve(res)
})
requests = []
return uni.$u.http.request(response.config)
} else {
return new Promise((resolve) => {
const fn = () => Promise.resolve(uni.$u.http.request(response.config))
requests.push({ fn, resolve })
})
}
default:
return uni.$u.toast(response.data.msg || '请求超时或服务器异常')
}
}
)
}