Axios重试请求忘记标头

hmtdttj4  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(288)

我有一个axios请求拦截器,它通过一个访问令牌添加载体授权。我还有一个响应拦截器,它捕获“令牌过期”响应,通过一个刷新机制获得一个新令牌,并重试原始请求。这看起来应该可以工作,除非原始请求被重试。它似乎丢失了所有的头文件。这让我的API后端感到困惑,因为它需要一个Content-Type(在原始请求中就有)。
注意:我很熟悉为什么axios不支持自定义的Content-Type头文件的问题,这不是我的问题--我没有设置一个-- axios自己做得很好。我只是不明白为什么axios自己设置的Content-Type头文件在重新发送原始请求时被删除了。
相关代码:

  1. const api = axios.create({
  2. baseURL: "https://www.mycoolapi.com",
  3. timeout: 5000,
  4. withCredentials: true,
  5. });
  6. api.interceptors.request.use((config) => {
  7. // Add the auth header (not messing with any other headers)
  8. config.headers!.Authorization = `Bearer ${accessToken}`;
  9. return config;
  10. }, (error) => Promise.reject(error));
  11. api.interceptors.response.use((response) => response,
  12. async (error) => {
  13. if (error.response.status == 401 && refreshToken && !error.config._isRetry) {
  14. // Token expired? Refresh, then retry the original request
  15. error.config._isRetry = true;
  16. await refreshLogIn();
  17. return api(error.config);
  18. }
  19. throw error;
  20. });
  21. async function refreshLogIn() {
  22. // Use the refresh token to get a new token pair
  23. const response = await api.post( "/token",
  24. new URLSearchParams({
  25. grant_type: "refresh_token",
  26. refresh_token: refreshToken,
  27. })
  28. );
  29. accessToken = response.data["access_token"];
  30. refreshToken = response.data["refresh_token"];
  31. }

如果我在响应拦截器中的return api(error.config)上放置一个断点,并检查原始请求(在error.config中),我会得到以下头(提醒一下,我只添加了Authorization头,其余的都是axios默认值或从requeset中计算出来的):

如果我随后单步执行到请求拦截器,在那里重试原始响应,我会得到这些头:

Content-Type已被删除,沿着Symbol(defaults)中的内容(无论是什么)。
我错过了什么?

ifmq2ha2

ifmq2ha21#

正如@Phil在评论中指出的,这是axios〉= 1.0.0中的一个bug。我想可以降级到0.27.2,但我只是用好的旧fetch重写了。反正我的用例很简单,少一个依赖项从来都不是坏事。

相关问题