cbvirtua 1.0.18 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/catch.js +87 -0
- package/package.json +1 -1
package/catch.js
CHANGED
|
@@ -87,3 +87,90 @@ let VueError = {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
export default VueError
|
|
90
|
+
import axios from 'axios'
|
|
91
|
+
import { getToken, setToken, getRefreshToken } from '@utils/auth'
|
|
92
|
+
|
|
93
|
+
// 刷新 access_token 的接口
|
|
94
|
+
const refreshToken = () => {
|
|
95
|
+
return instance.post('/auth/refresh', { refresh_token: getRefreshToken() }, true)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 创建 axios 实例
|
|
99
|
+
const instance = axios.create({
|
|
100
|
+
baseURL: process.env.GATSBY_API_URL,
|
|
101
|
+
timeout: 30000,
|
|
102
|
+
headers: {
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
let isRefreshing = false // 标记是否正在刷新 token
|
|
108
|
+
let requests = [] // 存储待重发请求的数组
|
|
109
|
+
|
|
110
|
+
instance.interceptors.response.use(response => {
|
|
111
|
+
return response
|
|
112
|
+
}, error => {
|
|
113
|
+
if (!error.response) {
|
|
114
|
+
return Promise.reject(error)
|
|
115
|
+
}
|
|
116
|
+
if (error.response.status === 401 && !error.config.url.includes('/auth/refresh')) {
|
|
117
|
+
const { config } = error
|
|
118
|
+
if (!isRefreshing) {
|
|
119
|
+
isRefreshing = true
|
|
120
|
+
return refreshToken().then(res=> {
|
|
121
|
+
const { access_token } = res.data
|
|
122
|
+
setToken(access_token)
|
|
123
|
+
config.headers.Authorization = `Bearer ${access_token}`
|
|
124
|
+
// token 刷新后将数组的方法重新执行
|
|
125
|
+
requests.forEach((cb) => cb(access_token))
|
|
126
|
+
requests = [] // 重新请求完清空
|
|
127
|
+
return instance(config)
|
|
128
|
+
}).catch(err => {
|
|
129
|
+
console.log('抱歉,您的登录状态已失效,请重新登录!')
|
|
130
|
+
return Promise.reject(err)
|
|
131
|
+
}).finally(() => {
|
|
132
|
+
isRefreshing = false
|
|
133
|
+
})
|
|
134
|
+
} else {
|
|
135
|
+
// 返回未执行 resolve 的 Promise
|
|
136
|
+
return new Promise(resolve => {
|
|
137
|
+
// 用函数形式将 resolve 存入,等待刷新后再执行
|
|
138
|
+
requests.push(token => {
|
|
139
|
+
config.headers.Authorization = `Bearer ${token}`
|
|
140
|
+
resolve(instance(config))
|
|
141
|
+
})
|
|
142
|
+
})
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return Promise.reject(error)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
// 给请求头添加 access_token
|
|
149
|
+
const setHeaderToken = (isNeedToken) => {
|
|
150
|
+
const accessToken = isNeedToken ? getToken() : null
|
|
151
|
+
if (isNeedToken) { // api 请求需要携带 access_token
|
|
152
|
+
if (!accessToken) {
|
|
153
|
+
console.log('不存在 access_token 则跳转回登录页')
|
|
154
|
+
}
|
|
155
|
+
instance.defaults.headers.common.Authorization = `Bearer ${accessToken}`
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// 有些 api 并不需要用户授权使用,则无需携带 access_token;默认不携带,需要传则设置第三个参数为 true
|
|
160
|
+
export const get = (url, params = {}, isNeedToken = false) => {
|
|
161
|
+
setHeaderToken(isNeedToken)
|
|
162
|
+
return instance({
|
|
163
|
+
method: 'get',
|
|
164
|
+
url,
|
|
165
|
+
params,
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export const post = (url, params = {}, isNeedToken = false) => {
|
|
170
|
+
setHeaderToken(isNeedToken)
|
|
171
|
+
return instance({
|
|
172
|
+
method: 'post',
|
|
173
|
+
url,
|
|
174
|
+
data: params,
|
|
175
|
+
})
|
|
176
|
+
}
|