nginx Axios在iOS设备上显示“网络错误”(以及“请求失败,状态代码为404”)

u91tlkcl  于 2023-08-03  发布在  Nginx
关注(0)|答案(2)|浏览(423)

我在iOS设备上有一个bug。所有对我的API的请求都会失败,错误为Network ErrorRequest 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 buildeas 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
}

0md85ypi

0md85ypi1#

我不完全确定,但我猜这是因为iOS设备有一些安全问题,防止它调用http-URL。
当我清理我的Node.JS-服务器设置时,它通过https调用它,没有调用端口8080,但只是定期没有任何端口,然后它开始工作。
这确实意味着我必须删除服务器上的nginx-setup,并将apache设置为反向代理。

a1o7rhls

a1o7rhls2#

试试这个,我在android上也遇到了同样的问题,两周后我终于修复了
https://github.com/axios/axios/issues/4406#issuecomment-1058701729

相关问题