import store from '@/store' import config from '@/config' import { getAccessToken, getRefreshToken, setToken, getExpiresTime } from '@/utils/auth' import { refreshToken } from '@/api/login' import errorCode from '@/utils/errorCode' import { toast, showConfirm, tansParams } from '@/utils/common' var that = this let timeout = 10000 const baseUrl = config.baseUrl + config.baseApi; // 请求队列 let requests = [] // 是否正在刷新中 let isRefreshing = false const request = config => { // 是否需要设置 token const isToken = (config.headers || {}).isToken === false config.header = config.header || {} var hastoken = getAccessToken() if (hastoken != null && !isToken) { config.header['Authorization'] = 'Bearer ' + hastoken } // 设置租户 TODO 芋艿:强制 1 先 config.header['tenant-id'] = '1'; // get请求映射params参数 if (config.params) { let url = config.url + '?' + tansParams(config.params) url = url.slice(0, -1) config.url = url } return new Promise((resolve, reject) => { uni.request({ method: config.method || 'get', timeout: config.timeout || timeout, url: config.baseUrl || baseUrl + config.url, data: config.data, // header: config.header, header: config.header, dataType: 'json' }).then(async response => { let [error, res] = response if (error) { toast('后端接口连接异常') reject('后端接口连接异常') return } const code = res.data.code || 200 const msg = errorCode[code] || res.data.msg || errorCode['default'] if (code === 401) { //token无效或已过期 if (!isRefreshing) { // 是否已经执行刷新 isRefreshing = true let token = getAccessToken(); // 获取到过期的token try { refreshToken({ refreshToken: getRefreshToken() // 刷新token的令牌存在token的对象里面,需要传给后端 }).then(reshRespore => { console.log(reshRespore, 'reshResporereshResporereshRespore'); // 请求成功把新的token存到本地 setToken(reshRespore.data); // 已经刷新了token,将所有队列中的请求进行重试 requests.forEach((item) => item(reshRespore.data .accessToken)) // requests = [] // // 每个接口请求都要存入队列,等刷新完以后都需要执行 // return new Promise((resolve) => { // // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行 // requests.push((token) => { // //这一步一定要有,刷新token,因为存入的信息是旧的token // response.config.header[ // 'Authorization'] = // 'Bearer ' + token; // resolve(uni.$u.http.request(response // .config)) //执行请求 // }) // that.$forceUpdate() // }) requests = [] // 刷新完token后重新调用上一次的接口 resolve(uni.$u.http.request(config)) // 执行请求 if (reshRespore.code == 400) { showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => { if (res.confirm) { uni.navigateTo({ url: '/pages/login' }) } }); } }) } catch { // uni.$u.toast('未知错误') showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => { if (res.confirm) { uni.navigateTo({ url: '/pages/login' }) } }); } finally { // 请求成功,开启刷新标识 isRefreshing = false } } else { // 添加到请求队列中 requests.push(token => { config.header['Authorization'] = 'Bearer ' + token; resolve(uni.$u.http.request(config)) // 执行请求 }) } } else if (code === 500) { toast(msg) reject('500') } else if (code !== 200) { toast(msg) reject(code) } resolve(res.data) }) .catch(error => { let { message } = error if (message === 'Network Error') { message = '后端接口连接异常' } else if (message.includes('timeout')) { message = '系统接口请求超时' } else if (message.includes('Request failed with status code')) { message = '系统接口' + message.substr(message.length - 3) + '异常' } toast(message) reject(error) }) }) } export default request