我在iOS设备上有一个bug。所有对我的API的请求都会失败,错误为Network Error
或Request failed with status code 404
。我试了很多方法来调试它。
更多上下文
- 该应用程序使用React Native和Expo编写
- 该API使用Node.JS和TypeScript构建。
- API运行在我自己的小VPS上(在Nginx服务器上,在端口上提供:8080,所以 * 不是 * 通过HTTPS)。
- Axios请求在iOS模拟器中 * 工作 *(在我的Mac上)。
- Axios请求 * 无法工作 *(错误为:“网络错误”或“请求失败,状态代码为404”)。
- 当我在手机上从Expo Go应用程序中尝试我的应用程序时,Axios请求 * 不起作用 *。
- 我使用
eas build
和eas submit
部署我的应用程序。
让我困惑的是,我不知道它为什么会失败,也不知道它在哪里失败。
解决方案尝试1:升级Expo SDK
我试着从版本48升级到49。这给我带来了各种其他问题-Axios错误仍然存在。所以我再次降级到48版(49版只出了3天)。
解决方案二:在我的服务器上检查tcpdump
我检查了我的服务器,如果它被击中在所有使用:sudo tcpdump -i any port 8080
。当我得到Axios错误时,我什么也没有得到。
所以我可以得出结论,错误是在它击中服务器之前。
解决方案三:实施哨兵
我尝试安装Sentry,以获得更好的堆栈和/或错误描述。这是一个稍微好一点的错误,但对我没有任何帮助。
解决方案4:将data
添加到标头
我在那个页面上发现了这个github评论,建议在get-request上添加data: {}
和data: null
作为头文件。
但没有解决问题。我忘了我把它留在里面了,所以一旦我清理了我的服务器,这就阻止了它的工作。
解决方案五:仔细查看失败的Axios请求
这是一个例子:
let targetEndpoint = 'http://example.org:8080/my-endpoint';
const config = getConfig(); // getting the headers
try {
const response = await axios.get(targetEndpoint, config);
return response.data.data;
} catch (error) {
console.error('Error getting data: ', error); // <-- This is where it makes it
throw error;
}
字符串
堆栈跟踪示例:
{
"message": "Request failed with status code 404",
"name": "AxiosError",
"stack": "AxiosError: Request failed with status code 404\n at settle (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:140101:37)\n at onloadend (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:139997:29)\n at call (native)\n at dispatchEvent (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:31686:31)\n at setReadyState (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:30432:29)\n at __didCompleteResponse (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:30234:29)\n at apply (native)\n at anonymous (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:30359:52)\n at apply (native)\n at emit (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:2236:40)\n at apply (native)\n at __callFunction (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:2805:36)\n at anonymous (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:2566:31)\n at __guard (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:2756:15)\n at callFunctionReturnFlushedQueue (http://192.168.0.53:19000/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false:2565:21)",
"config": {
"transitional": {
"silentJSONParsing": true,
"forcedJSONParsing": true,
"clarifyTimeoutError": false
},
"adapter": [
"xhr",
"http"
],
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1,
"env": {},
"headers": {
"Accept": "application/json, text/plain, */*"
},
"method": "get",
"url": "http://example.org:8080/my-endpoint"
},
"code": "ERR_BAD_REQUEST",
"status": 404
}
型
还有这个
{
"message": "Network Error",
"name": "AxiosError",
"stack": "AxiosError: Network Error\n at handleError (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:173910:39)\n at call (native)\n at dispatchEvent (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:42587:31)\n at setReadyState (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:40560:33)\n at __didCompleteResponse (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:40346:29)\n at apply (native)\n at anonymous (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:40488:52)\n at apply (native)\n at emit (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:3006:40)\n at apply (native)\n at __callFunction (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:3711:36)\n at anonymous (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:3431:31)\n at __guard (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:3648:15)\n at callFunctionReturnFlushedQueue (http://192.168.0.53:8081/node_modules/expo/AppEntry.bundle//&platform=ios&dev=true&hot=false&lazy=true:3430:21)",
"config": {
"transitional": {
"silentJSONParsing": true,
"forcedJSONParsing": true,
"clarifyTimeoutError": false
},
"adapter": [
"xhr",
"http"
],
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1,
"env": {},
"headers": {
"Accept": "application/json",
"content-type": "application/json"
},
"data": "{}",
"method": "get",
"url": "http://example.org:8080/my-endpoint"
},
"code": "ERR_NETWORK",
"status": null
}
型
2条答案
按热度按时间0md85ypi1#
我不完全确定,但我猜这是因为iOS设备有一些安全问题,防止它调用
http
-URL。当我清理我的
Node.JS
-服务器设置时,它通过https
调用它,没有调用端口8080
,但只是定期没有任何端口,然后它开始工作。这确实意味着我必须删除服务器上的
nginx
-setup,并将apache
设置为反向代理。a1o7rhls2#
试试这个,我在android上也遇到了同样的问题,两周后我终于修复了
https://github.com/axios/axios/issues/4406#issuecomment-1058701729