import axios from 'axios' import { ElMessage } from 'element-plus' import store from '@/stores' const mode = import.meta.env.MODE console.log('mode',mode) let app_base_api = import.meta.env.VITE_API_BASE_URL if(mode == 'prod'){ app_base_api = systemConfig.baseUrl } // create an axios instance const service = axios.create({ baseURL: app_base_api, // url = base url + request url // withCredentials: true, // send cookies when cross-domain requests timeout: 120 * 1000 // request timeout }) // request interceptor service.interceptors.request.use( (config) => { // do something before request is sent let userStore=store.userStore(); if (userStore.state.token) { // let each request carry token // ['X-Token'] is a custom headers key // please modify it according to the actual situation config.headers['Authorization'] ="Bearer "+ userStore.state.token config.headers['X-Authorization'] ="Bearer "+ userStore.state.refreshToken } return config }, (error) => { // do something with request error console.log(error) // for debug return Promise.reject(error) } ) // 是否在刷新Token标记 let isRefreshingToken=false // 刷新时后续的请求队列 let requestList = [] // response interceptor service.interceptors.response.use( /** * If you want to get http information such as headers or status * Please return response => response */ /** * Determine the request status by custom code * Here is just an example * You can also judge the status by HTTP Status Code */ async (response) => { if (response.status === 200) { const res = response.data //下载文件 if(res instanceof Blob){ return response } // 1 是正确 . if (res.code != 1) { //报错 ElMessage({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 }) return Promise.reject(new Error(res.message || 'Error')) } else { return res } } else { return Promise.reject(new Error(response.statusText || 'Error')) } }, async (error) => { if(error.status===401){ if(!isRefreshingToken){ // 修改isRefreshing状态 isRefreshingToken = true await store.userStore().reLogin() .catch(async err=>{ debugger //重新到登录页 store.userStore().resetAllToken() window.location.href="/login" return Promise.reject(err) }) // 重置状态 isRefreshingToken = false // token 刷新后将数组里的请求队列方法重新执行 requestList.forEach((it) => it()) // 重新请求完清空 requestList = [] // 继续未完成的请求 const resp = await service.request(error.config) // 返回请求结果 return Promise.resolve(resp) }else{ // 后面的请求走这里排队 // 返回未执行 resolve 的 Promise return new Promise(resolve => { // 用函数形式将 resolve 存入,等待获取新token后再执行 requestList.push(() => { resolve(service(error.config)) }) }) } }else{ console.log('err' + error) // for debug ElMessage({ message: error.message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } } ) export default service