Ошибка сети с Axios и эмулятором Android - PullRequest
0 голосов
/ 09 января 2019

Я получил приложение React-Native, работающее с серверной частью NodeJS, которая обслуживает API.

Мой фронт React-Native использует Expo и Axios для поиска маршрута моего API NodeJS (используя Hapi, Joi, Knex), что (например,) обновит мою БД (MySQL).

Все работает нормально с моим симулятором iOS. Однако в эмуляторе Android некоторые из моих попаданий по маршруту "" не работают "" со следующим сообщением об ошибке: Network Error - node_modules/axios/lib/core/createError.js:16:24 in createError (на самом деле, это сработало, но фронт не обнаруживает его ...)

Это странно, потому что, как я уже сказал, это ТОЛЬКО для некоторых моих маршрутов. Я изменил http://localhost:8000/api на http://10.0.2.2:8000/api, чтобы эмулятор Android получил доступ к моему API, и это нормально для этой части.

Глючный маршрут работает должным образом на iOS и работает на Insomnia / Postman (localhost:8000/api/sendMail). Он работает на эмуляторе Android, но приложение не обнаруживает его.

Это пример моего кода:

FRONT - При нажатии на мою кнопку «SendEmail»:

/* Button.js */
const sendAndEmailPromise = await sendEmail(this.state.email);

console.log(sendAndEmailPromise); // Output : NOTHING (not undefined, not null, N O T H I N G).

if (sendAndEmailPromise.status === 200) {
    // handle it
} else (sendAndEmailPromise.status === 403) {
    // etc. for each of my codeStatus that can be returned by my API 
}

/* MyAPI.js */
export function sendEmail(mail) {
    return axiosInstance
    .post(`/sendEmail`, null, {
      params: {
        mail
      },
    })
    .then(response => response) // Will not enter here
    .catch(error => {
       console.log(error); // Will output : NETWORK ERROR
    });
}

НАЗАД - Это обещание sendEmail:

// Will return true of false :
const isMailSend = await sendTheEmail(mail);
console.log(isMailSend); // Output : TRUE and I receive the email on my gmail, so Android Emulator HIT the route.

if (isMailSend) {
  return handler
    .response({
      data: {
        message: "Email sent.",
      },
    })
    .code(200);
} else {
  // Handle it and return another response
}

Теперь я ожидаю, что все будет работать нормально (что на самом деле произошло ...), и получу статус кода этого, а не «Ошибка сети».

Более того, возможно ли с помощью Axios получить другой уровень ошибки? Нечто более конкретное.

Проблема GitHub, которая не полностью совпадает, но, кажется, имеет отношение к чему-то эквивалентному: https://github.com/axios/axios/issues/973

Спасибо.

1 Ответ

0 голосов
/ 14 января 2019

Вы имеете дело с двумя проблемами здесь:

1) ваш эмулятор не работает, потому что он не может разрешить слово "localhost" в ip. это все равно что использовать localhost2.com, это ни к чему не приведет. Это должно быть указано на локальный IP-адрес вашего сервера 192.x.x.x

2) ваш сервер должен быть привязан к 0.0.0.0, потому что, привязав его к localhost, он не сможет разрешить локальные запросы, например 192.x.x.x. Если вы исправите привязку, у вашего эмулятора будет возможность увидеть сервер, а у почтальона тоже.

...