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地址,完全绕开跨网段限制:
- 任选一款内网穿透工具,执行命令映射本地3000端口,拿到对应的公网HTTPS地址
# 以ngrok为例,执行后会返回公网访问地址 ngrok http 3000 - 替换RN代码里的请求地址为拿到的公网地址:
// 替换为你实际拿到的穿透地址,必须是https开头 const res = await fetch('https://xxx-xxx-xxx.ngrok.io/tasks'); - 重启RN应用即可正常请求,这个方案不需要调整办公网络配置,HTTPS地址也不会触发Android的明文请求拦截。
方案2:调整网络让两台设备同网段
如果公司网络策略允许,可以把手机接入和电脑有线同网段的办公WiFi(不要连访客WiFi):
- 确认两台设备IP在同一网段,比如电脑IP是
192.168.6.180,手机拿到的IP也要是192.168.6.x段 - 放开电脑防火墙的3000端口入站规则,或者临时关闭防火墙测试连通性
- 解决Android明文请求拦截:打开RN项目下的
android/app/src/main/AndroidManifest.xml,给<application>标签添加配置:<application ... android:usesCleartextTraffic="true" ...> - 此时直接请求
http://192.168.6.180:3000/tasks即可连通,Expo也可以切换到LAN模式调试,延迟比Tunnel低很多。
方案3:模拟器调试特殊配置(仅适用于安卓模拟器,真机场景忽略)
如果用安卓模拟器调试,模拟器访问宿主机的固定特殊IP是10.0.2.2,直接把请求地址改成http://10.0.2.2:3000/tasks即可,不需要额外做穿透或者网络调整。
连通性验证步骤
改完配置不要直接跑APP,先做基础排查:
- 本地用REST Client确认后端接口本身正常
- 把要请求的后端地址直接输入手机自带浏览器访问,能正常返回接口JSON数据才说明网络层面通,浏览器都打不开的话不用查代码问题
- 浏览器访问正常后再回到APP发请求,基本不会再报Network request failed错误
补充:你现有代码里的CORS配置不需要调整,React Native的fetch请求不受浏览器同源策略限制,不存在跨域拦截问题。
内容的提问来源于stack exchange,提问作者ArminAH
相关产品推荐
相关产品推荐

