import axios, { AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios' import { message } from 'ant-design-vue'; import { pending, addPending, removePending, clearPending } from './pending' import { showStatus } from './utils'; export default (service: AxiosInstance) => { // 请求拦截器 service.interceptors.request.use((config: AxiosRequestConfig) => { removePending(config) // 在请求开始前,对之前的请求做检查取消操作 addPending(config) // 将当前请求添加到 pending 中 //获取token,并将其添加至请求头中 let token = localStorage.getItem('token') if (token) { config.headers.Authorization = `${token}`; } return config }, (error) => { // 错误抛到业务代码 error.data = {} error.data.msg = '服务器异常,请联系管理员!' return Promise.resolve(error) }) // 响应拦截器 service.interceptors.response.use((response: AxiosResponse) => { removePending(response) // 在请求结束后,移除本次请求 const status = response.status const { data } = response let msg = '' if (status < 200 || status >= 300) { // 处理http错误,抛到业务代码 msg = showStatus(status) message.error(msg) return Promise.reject(msg) } if (data && data.code && (data.code < 200 || data.code >= 300)) { // 处理后端返回的自定义错误,抛到业务代码 msg = showStatus(data.code) message.error(msg) return Promise.reject(msg) } return response }, (error) => { if (axios.isCancel(error)) { console.log('repeated request: ' + error.message) } else { // handle error code // 错误抛到业务代码 error.data = {} error.data.msg = '请求超时或服务器异常,请检查网络或联系管理员!' message.error(error.data.msg) } return Promise.reject(error) }) }