【发布时间】:2019-10-13 03:09:48
【问题描述】:
我正在努力让 axios 拦截器工作。
当我的令牌过期时,我需要它来刷新访问令牌并在刷新令牌后重试原始请求。 我有这部分工作。
问题是如果我有并发 api 调用,它只会在令牌第一次无效时重试第一个请求。
这是我的拦截器代码:
export default function execute() {
let isRefreshing = false
// Request
axios.interceptors.request.use(
config => {
var token = Storage.getAccessToken() //localStorage.getItem("token");
if (token) {
console.log('Bearer ' + token)
config.headers['Authorization'] = 'Bearer ' + token
}
return config
},
error => {
return Promise.reject(error)
}
)
// Response
axios.interceptors.response.use(
response => {
return response
},
error => {
const originalRequest = error.config
// token expired
if (error.response.status === 401) {
console.log('401 Error need to reresh')
originalRequest._retry = true
let tokenModel = {
accessToken: Storage.getAccessToken(),
client: 'Web',
refreshToken: Storage.getRefreshToken()
}
//Storage.destroyTokens();
var refreshPath = Actions.REFRESH
if (!isRefreshing) {
isRefreshing = true
return store
.dispatch(refreshPath, { tokenModel })
.then(response => {
isRefreshing = false
console.log(response)
return axios(originalRequest)
})
.catch(error => {
isRefreshing = false
console.log(error)
// Logout
})
} else {
console.log('XXXXX')
console.log('SOME PROBLEM HERE') // <------------------
console.log('XXXXX')
}
} else {
store.commit(Mutations.SET_ERROR, error.response.data.error)
}
return Promise.reject(error)
}
)
}
我不确定上面突出显示的 else 块中我需要什么。
编辑:
当我这样做时
return axios(originalRequest)
在 else 块中它可以工作,但是我对这些行为不满意。它基本上一次又一次地重试所有请求,直到刷新令牌。 我宁愿在刷新令牌后重试一次 任何想法
谢谢
【问题讨论】:
-
如果您在第一个请求上取消设置令牌由于过期而失败,然后将所有下一个请求放入某个队列中直到令牌被刷新,该怎么办。刷新令牌时,处理队列。
标签: axios vuex interceptor