我正在尝试制作一个通用的拦截器来授权我所有的外发请求。
我的逻辑如下:
我所有的传出请求/ API调用都首先通过拦截器检查我的令牌是否到期,如果响应未经授权,我将进行内部调用以刷新令牌并用新值更新存储密钥。
现在,我需要使用新的令牌值重新调用原始请求,但是我不知道如何检测通过拦截器传递的原始请求。
这是我的代码:
export const unregister = fetchIntercept.register({
request: function (url, config) {
return [url, config];
},
requestError: function (error) {
return Promise.reject(error);
},
responseError: function (error) {
return Promise.reject(error);
},
response: function (response) {
if (response.status == 401) {
Services.refreshToken((res)=>{
if (res.message == 'success') {
// if token has been refreshed
// recall the request again
}else {
// login again
}
})
}else {
return response;
}
}
})
问题是我不知道如何重新调用通过拦截器传递的相同请求。我对此进行了一些搜索,但找不到执行此方法的方法。
答案 0 :(得分:0)
fetch-intercept似乎未在响应中提供原始URL,因此,实际上您无法重新触发您的请求。
axios网络库还允许注册响应拦截器,并另外提供有关原始请求url的信息:
axios.interceptors.response.use(undefined, async apiError => {
if (
apiError.response &&
apiError.response.status === 401 &&
apiError.config
) {
try {
// refresh access token
const res = await Services.refreshToken();
if (res.message === 'success') {
const { config: oldRequest } = apiError;
// retrigger old request
axios.request({...oldRequest, headers: {},});
} else {
// go to login page.
}
} catch (error) {
// refresh failed, return to login page
}
}