我正在使用拦截器,该拦截器在状态代码为时刷新访问令牌,401
但我catch
已停止处理任何其他错误代码,例如400
request.js
import axios from 'axios'
const axiosApiInstance = axios.create()
axiosApiInstance.interceptors.response.use(
(response) => {
return response
},
(error) => {
return new Promise((resolve) => {
const originalRequest = error.config
const refreshToken = localStorage.getItem("refresh")
if (error.response && error.response.status === 401 && error.config && !error.config.__isRetryRequest && refreshToken) {
originalRequest._retry = true
const response = fetch('http://127.0.0.1:8000/api/token/refresh/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
refresh: refreshToken,
}),
})
.then((res) => res.json())
.then((res) => {
localStorage.setItem("access", res.access)
originalRequest.headers['Authorization'] = 'Bearer ' + res.access
return axios(originalRequest)
})
resolve(response)
}
return Promise.reject(error)
})
},
)
export default axiosApiInstance
您需要将第二个参数传递给callback,以new Promise
调用reject
,然后使用该函数而不是拒绝promise Promise.reject
。
没有测试,我无法验证,这现在很难设置,但是看起来很像是您没有正确地拒绝从错误回调返回的承诺。如果您可以确定在的情况下诺言从未得到解决或拒绝400
,那将有助于确认我的怀疑。不过,请尝试进行此更改:
新的Promise回调的参数:
return new Promise((resolve) => {
变成
return new Promise((resolve, reject) => {
然后拒绝,而不是
return Promise.reject(error)
只是这样做
reject(error) // return does nothing here, can be omitted
编辑:
虽然,有人很好地指出这是一个有前途的反模式。您无缘无故地在创建一个新的Promise。
import axios from 'axios'
const axiosApiInstance = axios.create()
axiosApiInstance.interceptors.response.use(
(response) => {
return response
},
(error) => {
const originalRequest = error.config
const refreshToken = localStorage.getItem("refresh")
if (error.response && error.response.status === 401 && error.config && !error.config.__isRetryRequest && refreshToken) {
originalRequest._retry = true
return fetch('http://127.0.0.1:8000/api/token/refresh/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
refresh: refreshToken,
}),
})
.then((res) => res.json())
.then((res) => {
localStorage.setItem("access", res.access)
originalRequest.headers['Authorization'] = 'Bearer ' + res.access
return axios(originalRequest)
})
}
return Promise.reject(error)
},
)
export default axiosApiInstance
应该是这样的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句