React Native:在发生错误时将axios重定向到其他地址

时间:2018-10-18 06:38:24

标签: javascript reactjs react-native axios

安装程序:我目前正在与两个Mac用户组成的小组中进行编码(我正在运行Linux)。我们正在使用React Native制作一个移动应用程序。他们正在iPhone模拟器上测试该应用程序,而该模拟器不适用于Linux。我通过将程序包提供给实际的Android手机来测试该应用。在我尝试向本地服务器发出axios请求之前,此方法工作正常。 根据axios请求,我们输入端点“ http://localhost:3001/whatever”。由于我的程序副本正在移动设备上运行,因此localhost是指该设备而不是计算机。我可以通过将“ localhost”更改为我的IP地址来使请求正常工作。

例如,

//Instead of
axios.get('http://localhost:3001/api/point')
    .then(response => doaThing(response));
//I could do
axios.get('http://my.ip.addr:3001/api/point')
    .then(response => doaThing(response));

问题:Axios对我的团队来说效果很好。如果不进行更改,它将对我不起作用。我不想在每次提交之前对代码库进行一堆微小的改动。如果第一个请求找不到服务器,是否可以告诉axios尝试我的IP地址?目前,axios会针对此错误返回“ request.status = 0”的对象。

如果这是一个愚蠢的主意,请告诉我:我试图通过为axios创建一个粗糙的包装来解决此问题,该包装可以进行呼叫,检查错误消息以及是否具有状态的0,再打一次。任何回应都应返回。

export default axiOS = {
  get: async (endpoint = '', body = {}) => {
    await axios.get(`http://localhost:3001${endpoint}`)
      .then(response => response)
      .catch(async err => {
        //if axios cannot find the server, the status code will be 0
        if (err.request.status === 0) {
          await axios.get(`http://my.ip.addr:3001${endpoint}`)
          .then(response => response)
          .catch(err => console.log("GET Error: ", err))
        } else {
          console.log("GET Error: ", err);
        }
      });
  }, //etc. for put, post, and delete
}

呼叫
let response = axiOS.get('/api/time');

这可以使每个人的生活变得更轻松,但我似乎无法在返回不确定的值之前解决承诺。

tl; dr 所以我的问题至少有两个可能的解决方案

  1. 在出现错误时能否使axios路由到辅助地址?
  2. 我的代码是否可以解决此问题?如果是,该如何更改才能将响应返回到第一个成功的请求?
  3. 可能我没有考虑过第三个解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果应将应用程序分发给公众,则该应用程序应以某种方式知道与哪个服务器联系。现在,在开发中,它是localhost或本地ip,以后很可能是一个域。也就是说:在每种情况下,您都需要找到一种方法来配置要使用的URL。我建议使用.env文件,并以某种方式使url难以进入源代码,以便您的源代码仅使用配置中的url。这样一来,在您的生产应用程序中便可以轻松地拥有最终网址。