axios 和 android 模拟器的网络错误

Posted

技术标签:

【中文标题】axios 和 android 模拟器的网络错误【英文标题】:Network error with axios and android emulator 【发布时间】:2019-06-04 03:38:53 【问题描述】:

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

我的 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 Emulator 可以访问我的API,这部分没问题。

有问题的路线在 iOS 上运行正常,在 Insomnia / Postman (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
    );

BACK -- 这是 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

谢谢。

【问题讨论】:

您是否在设备上尝试过您的服务器外部 ip 而不是使用 localhost 域?设备上的 localhost 肯定不会工作。 Axios 在 android 上 100% 运行,因为我在多个项目中使用它。 感谢您的回复。为什么你的意思是“外部IP”?现在,我在安卓模拟器上使用http://10.0.2.2:8000/api(而不是localhost)。路由调用正在工作(因为发送了邮件),但是,它进入 catch() 并出现一般错误......谢谢您的时间。 external ip 我的意思是你当前用于全局访问的服务器 ip (ipv4)。如果它在本地主机中,您必须使用您的服务器 ip,这可能类似于 192.168.1.1,例如您使用的是什么操作系统? 如果您的服务器在您的机器上运行,则使用它来查找您的本地 IP whatismybrowser.com/detect/what-is-my-local-ip-address 我在 MacOS Mojave 上使用 EXPO 运行它。当我尝试使用 Postman 访问我的 IPV4(首选项 > 网络 > 192.168.63.141)时,我得到了:"Error: Couldn't connect to server" 【参考方案1】:

你在这里处理两个问题:

1) 您的模拟器无法工作,因为它无法将“localhost”一词解析为 ip。就像使用 localhost2.com 它不会解决某些问题。这必须指向你服务器的本地ip 192.x.x.x

2) 您的服务器必须绑定到 0.0.0.0,因为通过将其绑定到 localhost,它无法解析为 192.x.x.x 等本地请求。如果您修复绑定,您的模拟器将有可能看到服务器,邮递员也可以。

【讨论】:

1.我的模拟器正在工作,我的一些路由返回网络错误(无论如何也可以......)。用于这样做的 URL 是:http://10.0.2.2:8000/api,它将模拟器解析为当前机器的本地主机。 2. 将我的host: "localhost" 绑定到"0.0.0.0",而不是解析URL http://192.168.63.141:8000/api/,现在可以正常工作。谢谢你。 3. 所以我只是再次重新测试它,用http://192.168.63.141:8000/api/而不是localhost for iOS和10.0.0.2 for Android,调用正常,但仍然存在相同的“网络错误”。 我试过了,但它似乎与这个问题无关......我将方法从 POST 更改为 GET 但我仍然有同样的错误【参考方案2】:

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

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

【讨论】:

哇,谢谢!只是注意到它在没有这些标题的情况下在 iOS 上工作。但是,在 Android 上,它们是必需的。你让我开心。

以上是关于axios 和 android 模拟器的网络错误的主要内容,如果未能解决你的问题,请参考以下文章

Axios Post 在调试中工作,但在 Android 发布版本中出现“网络错误”

使用post表单数据上传axios图片总是返回网络错误

android中的React-native POST请求通过https返回网络错误

Android模拟器问题:分配内存失败:8?

Axios 模拟适配器给出错误“错误:请求失败,状态码 404”

axios 的网络错误和本机反应