Axios和Android模拟器出现网络错误

时间:2019-01-09 11:13:33

标签: react-native axios react-native-android expo

我有一个React-Native应用程序,它与提供API的NodeJS后端一起使用。

我的React-Native前端正在使用Expo和Axios来访问我的NodeJS API的路由(使用Hapi,Joi,Knex),这将(例如)更新我的数据库(MySQL)。

我的iOS模拟器一切正常。但是,在Android Emulator上,我在路线““不起作用”“上的某些匹配出现以下错误消息: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上正常运行,并且在失眠/邮递员(localhost:8000/api/sendMail上正常运行。它可以在Android Emulator上运行,但应用程序无法检测到它。

这是我的代码的示例:

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

谢谢。

2 个答案:

答案 0 :(得分:5)

您在这里处理两个问题:

1)您的仿真器无法正常工作,因为它无法将单词“ localhost”解析为ip。就像使用localhost2.com一样,它无法解决问题。这必须指向服务器192.x.x.x的本地IP

2)您的服务器必须绑定到0.0.0.0,因为通过将其绑定到本地主机无法将其解析为本地请求(如192.x.x.x)。如果您修复了绑定问题,那么您的仿真器将有可能看到服务器,邮递员也将看到它。

答案 1 :(得分:0)

在标头中添加这些参数解决了我的问题

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"