import store from '@/store' import config from '@/config' import { getToken } from '@/utils/auth' import errorCode from '@/utils/errorCode' import { toast, showConfirm, tansParams } from '@/utils/common' let timeout = 30000 const baseUrl = config.baseUrl const request = async (config) => { // 是否需要设置 token const isToken = (config.headers || {}).isToken === false config.header = config.header || {} if (getToken() && !isToken) { config.header['Authorization'] = 'Bearer ' + getToken() } // get请求映射params参数 if (config.params) { let url = config.url + '?' + tansParams(config.params) url = url.slice(0, -1) config.url = url } return new Promise(async (resolve, reject) => { try { const response = await uni.request({ method: config.method || 'GET', timeout: config.timeout || timeout, url: config.baseUrl || baseUrl + config.url, data: config.data, header: config.header, dataType: 'json' }) const [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) { // 自动登录 const loginForm = { username: uni.getStorageSync('u1'), password: uni.getStorageSync('p1'), code: "", uuid: '' } try { await store.dispatch('Login', loginForm).then(async () => { // 保存原始请求配置以备重试 // const originalConfig = { // method: config.method || 'GET', // timeout: config.timeout || timeout, // url: config.baseUrl || baseUrl + config.url, // data: config.data, // header: config.header, // dataType: 'json' // } const originalConfig = { ...config }; // 重新发送请求 const retryResponse = await retryRequest(originalConfig) resolve(retryResponse) }); // // 保存原始请求配置以备重试 // const originalConfig = { // method: config.method || 'GET', // timeout: config.timeout || timeout, // url: config.baseUrl || baseUrl + config.url, // data: config.data, // header: config.header, // dataType: 'json' // } // //const originalConfig = { ...config }; // // 重新发送请求 // const retryResponse = await retryRequest(originalConfig) // resolve(retryResponse) } catch (loginError) { showConfirm('自动重登失效,您可以继续留在该页面,或者手动登录?').then(res => { if (res.confirm) { store.dispatch('LogOut').then(res => { uni.reLaunch({ url: '/pages/login' }) }) } }) reject(loginError) } } else if (code === 500) { toast(msg) reject('500') } else if (code !== 200) { toast(msg) reject(code) } else { 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) } }) } // 用于重新发送请求的方法 // const retryRequest = async (originalConfig) => { // const response = await request(originalConfig) // return response // } const retryRequest = async (originalConfig) => { // 重新获取最新的 token const token = getToken() // 明确设置请求方法和参数,并更新 header 中的 token const response = await uni.request({ method: originalConfig.method || 'GET', timeout: originalConfig.timeout || timeout, url: originalConfig.baseUrl || baseUrl + originalConfig.url, data: originalConfig.data, header: { ...originalConfig.header, Authorization: token ? 'Bearer ' + token : undefined }, dataType: 'json' }) const [error, res] = response if (error) { throw new Error('重试请求失败') } console.log(res.data) return res.data } export default request