Axios 以某种方式缓存我的获取用户请求本机反应

Posted

技术标签:

【中文标题】Axios 以某种方式缓存我的获取用户请求本机反应【英文标题】:Axios is caching somehow my get user request react native 【发布时间】:2019-11-23 05:52:33 【问题描述】:

我正在使用 Axios ("axios": "^0.19.0") 向我的后端发出 GET 请求,因为我已经通过 Postman macOS 应用程序发送相同的令牌对其进行了测试,并返回正确的用户对象。

但在我的 React Native 应用程序中,每当我发出 get 请求并传递相同的不记名令牌时,我都会得到我作为响应登录的最后一个用户。

这就是我发送请求的方式:

getUserByToken: function(token) 
        var headers = [
             key: 'Authorization', value: 'Bearer ' + token,
             key: 'Content-Type', value: 'application/x-www-form-urlencoded',
             key: 'Cache-Control', value: 'no-cache'
        ];

        setHeaders('get', headers);
        return AxiosInstance.get('/user');
    ,

setHeaders 方法用于设置请求的标头,我将所有 http 方法重置为空对象并为以下请求设置正确的键值。

export const setHeaders = (type, props) => 
    AxiosInstance.interceptors.request.use(config => 
        config.headers[type] = ;

        props.forEach((prop) => 
            config.headers[type][prop.key] = prop.value;
        );
        return config;
    );

如您所见,我什至尝试使用 Cache-Control: no-cache 但仍然无缘无故地保持缓存。

这就是我从AuthView.js 调用此函数的方式

 UserServices.getUserByToken(loginData.access_token)
        .then(userResponse => 
   // here userResponse is the previous user! 
   // even though i'm passing the correct token
            this.props.onSetUserInfo(userResponse.data);
            this.setState(
                loading: false
            , () => 
                startMainTabs();
            );
        );

为什么会发生这种情况?

谢谢。

【问题讨论】:

是否检查了开发控制台中的网络选项卡是否请求进行? @Tapas 好的,所以看起来这可能是 Axios 的问题......即使我正在传递新令牌,Reactotron 中的请求对象是以前的令牌! wtf这很奇怪。 哦,我想我知道为什么了!!!你看到那里的 setHeader 了吗?它有点异步,所以有时它会在设置或完成设置新标头之前先发送 http 请求,我需要用 Promise 来做到这一点。 @msqar 是的,这里的问题是setHeaders 中的代码,发生了一个回调,您在发送请求之前没有等待确认 - 即使它是同步的,回调仍然会运行请求结束后 @James 是的,你能帮我改进一下吗? 【参考方案1】:

问题似乎是在实际设置标头之前发送请求。原因是setHeader 在内部依赖回调在实际设置标头之前触发,并且没有钩子允许调用代码在触发请求之前等待此代码完成。

虽然可以修复,但让 setHeader 返回 Promise 并使用 config 对象解决

export const setHeaders = (type, props) => 
  return new Promise(resolve => 
    AxiosInstance.interceptors.request.use(config => 
      config.headers[type] = ;
      props.forEach((prop) => 
        config.headers[type][prop.key] = prop.value;
      );
      return resolve(config);
    );
  );

然后在getUserByTokenawait 中标头

getUserByToken: async function (token) 
  var headers = [
     key: 'Authorization', value: 'Bearer ' + token,
     key: 'Content-Type', value: 'application/x-www-form-urlencoded',
     key: 'Cache-Control', value: 'no-cache'
  ];

  await setHeaders('get', headers);
  return AxiosInstance.get('/user');

【讨论】:

试图找出为什么即使 promise 似乎被正确编码,但它不起作用。调试atm。 无法使其工作,但似乎我可以通过像这样直接设置它们来使其工作:props.forEach((prop) => AxiosInstance.defaults.headers.common[prop.键] = prop.value; ); 不,没有错误,但从未进入 AxiosInstance.interceptors.request.use() 函数,不知道为什么,尝试了很多东西,但没有成功。所以我最终直接设置它们。 @msqar 好吧,如果有一种不需要回调的直接设置方法,那显然更好:) 我也得到了缓存/旧响应。在 James 回答的帮助下,我做到了:axios.get("API", headers: "Cache-Control": "no-cache " );它奏效了。【参考方案2】:

请检查下面的代码,我已经在我的项目中测试过,它工作正常。

getUserByToken: function(token) 
        var headers = [
             key: 'Authorization', value: 'Bearer ' + token,
             key: 'Content-Type', value: 'application/x-www-form-urlencoded',
             key: 'Cache-Control', value: 'no-store'
        ];

        setHeaders('get', headers);
        return AxiosInstance.get('/user');
    ,

使用上面相同的代码它会解决你的问题。

【讨论】:

以上是关于Axios 以某种方式缓存我的获取用户请求本机反应的主要内容,如果未能解决你的问题,请参考以下文章

axios 获取实时数据请求

具有本机反应的 Axios 不返回文档并崩溃应用程序

在我的反应原生项目中使用 axios 显示对象给出未定义

.env 变量导致我的对象值出现错误,这些值是我从 axios get 请求中获取的反应

axios 的网络错误和本机反应

网络请求失败对 https 图像上传 Android 做出本机反应