React Native 拉取远程MySQL数据出现网络请求失败问题如何解决?
问题根源&解决步骤
1. 接口请求地址错误
你前端写的http://localhost:3000/FilmShowings指向的是运行React Native应用的设备(模拟器/真机)自身的本地端口,而你的后端服务跑在开发电脑上,两者不在同一个网络上下文,自然请求不通:
- 安卓模拟器访问电脑本地服务,地址改成
http://10.0.2.2:3000/FilmShowings - iOS模拟器访问电脑本地服务,地址改成
http://<你电脑的局域网IP>:3000/FilmShowings - 真机调试的话,确保手机和电脑连同一个WiFi,同样填电脑的局域网IP作为请求地址
2. 明文HTTP请求权限未配置
iOS和安卓系统默认禁止应用发送未加密的HTTP请求,需要单独配置白名单:
- 安卓:在
android/app/src/main/AndroidManifest.xml的application标签增加属性android:usesCleartextTraffic="true" - iOS:在
ios/[项目名]/Info.plist的NSAppTransportSecurity字典下增加NSAllowsArbitraryLoads设为true
3. 前端数据解析逻辑错误
你的后端接口直接返回电影数据数组,没有外层包裹FilmShowings字段,所以前端的setData(json.FilmShowings)会拿到undefined,改成setData(json)即可。
4. 后端代码潜在问题修复
你当前的后端代码每次收到请求都会新建数据库连接、关闭连接,并发请求时会直接报错,建议调整逻辑如下:
// 服务启动时仅连接一次数据库,去掉单次请求内的connect/end逻辑 connection.connect(err => { if (err) throw err; console.log('数据库连接成功'); }); app.get('/FilmShowings', function (req, res) { connection.query('SELECT * FROM FilmShowings', function (error, results) { if (error) return res.status(500).send(error); res.send(results); }); }); // 配置监听0.0.0.0,允许局域网设备访问服务 app.listen(3000, '0.0.0.0', () => { console.log('Go to http://0.0.0.0:3000/FilmShowings to see FilmShowings'); });
5. 调试排查技巧
可以先在手机/模拟器的自带浏览器里直接输入你要请求的接口地址,若能正常拿到返回数据则说明网络/后端配置正常,再排查前端代码逻辑问题即可。
内容的提问来源于stack exchange,提问作者ZachKrae
相关产品推荐
相关产品推荐

