Expo构建React Native APK后请求服务器报AxiosError: Network Error求助
解决Expo打包APK后Axios请求Network Error问题
下面是针对你遇到的问题的排查和解决步骤:
1. 修正请求头配置
你在Axios请求里添加的Access-Control-Allow-Origin、Access-Control-Allow-Headers、Access-Control-Allow-Methods属于服务器响应头,不是客户端请求头,客户端发送这些头毫无意义,反而可能干扰请求。先把这些多余的头删掉,修改后的请求代码:
await axios.post('http://xx.xxx.xxx.xxx:3000/api/reg', reg_data, { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json; charset=utf-8' } }) .then(async(response) => { result = {id: response.data.id, error: false} }) .catch(async error => { result = {id: false, error} })
2. 确认服务器的可访问性
- 开发阶段你可能用的是局域网IP(比如192.168.x.x),但打包成APK后,手机如果不在同一局域网,或者服务器没有公网IP,就无法连接。确保你的服务器有公网可访问的IP/域名,并且端口3000已经在防火墙/云服务商控制台开放。
- 直接在手机浏览器里访问
http://xx.xxx.xxx.xxx:3000/api/reg(GET方式),看是否能正常返回内容,排除网络层面的问题。
3. 处理Android明文HTTP限制
Android 9(API 28)及以上默认禁止明文HTTP请求,只允许HTTPS。如果你的服务器用的是HTTP,需要配置网络安全策略:
在Expo项目的app.json中添加以下配置:
{ "expo": { "android": { "networkSecurityConfig": { "domainConfigs": [ { "domain": "xx.xxx.xxx.xxx", "cleartextTrafficPermitted": true } ] } } } }
把xx.xxx.xxx.xxx替换成你的服务器IP或域名,这样就能允许该域名的明文HTTP请求。
4. 检查服务器的CORS配置
虽然Postman测试正常,但Postman不受浏览器CORS限制,需要确保Express服务器的CORS配置正确。可以用cors中间件:
const express = require('express'); const cors = require('cors'); const app = express(); // 允许所有来源的请求,生产环境建议限制特定域名 app.use(cors()); // 或者更精细的配置 app.use(cors({ origin: '*', methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'] }));
确保服务器已经正确配置CORS,否则手机端请求会被拦截。
5. 排查Axios其他配置问题
- 检查是否设置了合理的
timeout,比如timeout: 10000,避免请求超时被判定为网络错误。 - 确认没有配置开发环境的代理,打包后代理配置会失效,直接使用真实服务器地址。
如果以上步骤都试过还是有问题,可以补充以下信息:
- 服务器的公网IP/域名是否正确
- 手机是否能ping通服务器IP
- 错误日志的详细信息(比如error.message、error.code)
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

