You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo隧道模式下React Native fetch请求Node后端报网络请求失败

问题根因

核心误区:Expo Tunnel模式仅转发React Native调试包、热更新的连接,不会代理你本地运行的后端服务。
你当前的网络环境里,工作电脑接有线内网,手机连访客WiFi,两个网络本身做了网段隔离,访客WiFi默认禁止访问办公有线网段的内网IP,手机根本路由不到192.168.6.180:3000这个地址,这是请求失败的核心原因。
除此之外还有几个常见的叠加触发点:

  • Android 9及以上版本默认拦截所有非HTTPS的明文HTTP请求,就算网络连通也会被系统直接挡掉
  • 电脑系统防火墙默认阻止外部设备访问Node.js监听的3000端口
  • 你绑定的192.168.6.180是内网私有IP,没有公网路由,不在同网段的设备根本找不到这个地址
解决方案

按落地成本从低到高排序:

方案1:内网穿透暴露本地后端(最适配当前Tunnel调试场景)

既然已经在用公网隧道调试APP,直接把本地3000端口的后端服务也通过内网穿透工具映射成公网可访问的HTTPS地址,完全绕开跨网段限制:

  1. 任选一款内网穿透工具,执行命令映射本地3000端口,拿到对应的公网HTTPS地址
    # 以ngrok为例,执行后会返回公网访问地址
    ngrok http 3000
    
  2. 替换RN代码里的请求地址为拿到的公网地址:
    // 替换为你实际拿到的穿透地址,必须是https开头
    const res = await fetch('https://xxx-xxx-xxx.ngrok.io/tasks');
    
  3. 重启RN应用即可正常请求,这个方案不需要调整办公网络配置,HTTPS地址也不会触发Android的明文请求拦截。

方案2:调整网络让两台设备同网段

如果公司网络策略允许,可以把手机接入和电脑有线同网段的办公WiFi(不要连访客WiFi):

  1. 确认两台设备IP在同一网段,比如电脑IP是192.168.6.180,手机拿到的IP也要是192.168.6.x段
  2. 放开电脑防火墙的3000端口入站规则,或者临时关闭防火墙测试连通性
  3. 解决Android明文请求拦截:打开RN项目下的android/app/src/main/AndroidManifest.xml,给<application>标签添加配置:
    <application
      ...
      android:usesCleartextTraffic="true"
      ...>
    
  4. 此时直接请求http://192.168.6.180:3000/tasks即可连通,Expo也可以切换到LAN模式调试,延迟比Tunnel低很多。

方案3:模拟器调试特殊配置(仅适用于安卓模拟器,真机场景忽略)

如果用安卓模拟器调试,模拟器访问宿主机的固定特殊IP是10.0.2.2,直接把请求地址改成http://10.0.2.2:3000/tasks即可,不需要额外做穿透或者网络调整。

连通性验证步骤

改完配置不要直接跑APP,先做基础排查:

  1. 本地用REST Client确认后端接口本身正常
  2. 把要请求的后端地址直接输入手机自带浏览器访问,能正常返回接口JSON数据才说明网络层面通,浏览器都打不开的话不用查代码问题
  3. 浏览器访问正常后再回到APP发请求,基本不会再报Network request failed错误

补充:你现有代码里的CORS配置不需要调整,React Native的fetch请求不受浏览器同源策略限制,不存在跨域拦截问题。

内容的提问来源于stack exchange,提问作者ArminAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 05:49:18