【发布时间】:2021-04-14 17:14:02
【问题描述】:
我正在尝试为 javascript 中的 fetch 创建一个拦截器(反应更具体)。它应该从每个被调用的 fetch 中获取结果,如果是 401 错误,它应该启动对另一个路由的新 fetch 调用以获取 cookie(刷新令牌)。然后,应该再次尝试最初的 fetch 调用(因为现在用户已登录)。
我已经成功触发了新的 fetch 调用并为每个人发回了 cookie,但我遇到了以下两个问题:
-
我现在不知道如何在收到刷新令牌后重试 fetch 调用。那可能吗?我找到了 fetch-retry npm (https://www.npmjs.com/package/fetch-retry),但不确定如何以及是否可以在拦截器上实现它,什么时候应该为原始 fetch 调用完成。
-
我似乎对异步等待做错了(我认为),因为拦截在返回数据之前没有等待 fetch 调用(原始 fetch 上的状态码似乎是 401 而不是应该是 200在我们得到 cookie 之后。我还尝试在拦截器中返回 fetch 的响应,但返回的是 undefined)。
关于如何解决这个问题的任何想法?有人做过类似的吗?
下面是我的代码:
(function () {
const originalFetch = fetch;
fetch = function() {
return originalFetch.apply(this, arguments).then(function(data) {
if(data.status === 401) {
console.log('not authorized, trying to get refresh cookie..')
const fetchIt = async () => {
let response = await fetch(`/api/token`, {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json'
},
});
}
fetchIt();
}
return data
});
};
})();
编辑:让我更清楚我的追求。我需要一个如上所述的拦截器才能工作,所以我不必在每次 fetch 调用后做这样的事情:
getData() {
const getDataAsync = async () => {
let response = await fetch(`/api/loadData`, { method: 'POST' });
if(response.status === 401) {
let responseT = await fetch(`/api/token`, {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json'
},
});
if(responseT.status === 401) {
return responseT.status
}
if(responseT.status === 200) {
response = await fetch(`/api/loadData`, { method: 'POST' });
}
}
let data = await response.json();
//Do things with data
};
getDataAsync();
};
所以基本上拦截器应该:
- 检查是否有401,如果有则:
- 获取 api/令牌
- 如果 api/token 返回 401,它应该只返回那个。
- 如果 api/token 返回 200,它应该再次运行原始提取
【问题讨论】: