显然,这个问题的核心在于 axios 的封装和使用。
我们首先来看看封装,这个很好找,要么是 services 要么是 request,很快就定位到了具体的文件:utils/request**.js**
:
简单分析一下,不难看出,整个文件大致宏观框架如下:
const service = axios.create({/*...*/})
service.interceptors.request.use(onFulfilled, onRejected)
service.interceptors.response.use(onFulfilled, onRejected)
export default service
整体的思路是:创建实例 → 添加请求和响应拦截器 → 导出实例。
下面具体看看这几步:
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
})
没什么好说的,设定了 baseURL
和 timeout
,当然 axios 还有非常多其他的配置,这里以分析 vue-element-admin 学习经验为主要目的,就不罗列其他属性,感兴趣的读者可以自行查阅:axios 中文文档 - 请求配置
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['X-Token'] = getToken()
}
return config
},
error => {
console.log(error)
return Promise.reject(error)
}
)
显然,请求拦截器的核心功能就是为请求加上 token 信息。
service.interceptors.response.use(
response => {
const res = response.data
if (res.code !== 20000) {
Message({
message: res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
MessageBox.confirm(
'You have been logged out, you can cancel to stay on this page, or log in again',
'Confirm logout',
{
confirmButtonText: 'Re-Login',
cancelButtonText: 'Cancel',
type: 'warning'
}
).then(() => {
store.dispatch('user/resetToken').then(() => {
location.reload()
})
})
}
return Promise.reject(new Error(res.message || 'Error'))
} else {
return res
}
},
error => {
console.log('err' + error)
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
响应拦截器的主要功能则是做各种错误处理。
至此,不难看出,axios 的封装,核心思路如下:
baseURL
和 timeout