React Native: перенаправление axios на другой адрес при ошибке - PullRequest
0 голосов
/ 18 октября 2018

Настройка : в настоящее время я пишу код в группе с двумя пользователями 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 голосов
/ 18 октября 2018

Если приложение должно быть общедоступным, приложение должно каким-то образом знать, с каким сервером связаться.Прямо сейчас, в разработке это localhost или локальный ip, а позже это, скорее всего, будет домен.Тем не менее, в каждом случае вам нужно найти способ настроить приложение с использованием URL-адреса.Я бы порекомендовал использовать файл .env и каким-то образом указать URL-адрес в исходном коде, чтобы ваш исходный код просто использовал URL-адрес из конфигурации.Таким образом, будет легко иметь окончательный URL в вашем производственном приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...