使用 react-native 应用程序随机挂起获取请求

Bri*_*ich 5 javascript networking ruby-on-rails react-native actioncable

前几天,我注意到来自应用程序的一些 API 调用没有被静默执行。我在fetch请求之前和之后注销了 console.log ,瞧,获取上的等待从未完成。

// in an async js function...

let response;
try {
   console.log("START")
   response = await fetch(url, { headers, method, body });
   console.log("END")
} catch (err) {
   console.log(err)
}  
Run Code Online (Sandbox Code Playgroud)

会结束吗?

在应用程序的日志中,我看到“开始”,但我等了 2-5 分钟,它通常会打印“结束”

是服务器吗?

我怀疑它只是一个缓慢的服务器 API,但是拖尾服务器上的日志,直到“开始”后约 2 分钟,请求才被发送——我看到它在打印时被发送/处理出“结束”

我将 actioncable 连接到 Redis,安装在我的 Rails 应用程序中,通过 Heroku 上的 Puma 提供服务。

我可以重现它吗?

重现它非常困难,但我通常可以通过按下command + RiOS 应用程序模拟器触发它,这会重新加载应用程序,并启动一些挂起的新 API 请求。

还要别的吗?

我有一个连接到服务器的 websocket 连接。不确定这是否会造成任何干扰。

我试过对 AbortController 使用超时,但它只等待 5 秒然后终止请求(但没有新请求成功)

一旦启动,每个 API 请求都会挂起。

我的问题

  • 有什么好的方法来调试这个吗?
  • 是否有一些我不知道的可能会在后台排队获取请求?

更新:好的,也许是我的服务器......?我尝试将 URL 更改为其他网站,但请求似乎已完成。**

更新:好的,我认为是服务器。我尝试了一个curl请求,traceroute然后他们显示出一些东西挂了很长时间......

跟踪路由结果

traceroute to us-east-1-a.route.herokuapp.com (127.0.0.54), 64 hops max, 52 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
(it never ends)
Run Code Online (Sandbox Code Playgroud)

卷曲结果

curl -v https://redacted.herokuapp.com/v3/users/me
*   Trying 127.0.0.54...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.54 port 443 failed: Operation timed out
* Failed to connect to redacted.herokuapp.com port 443: Operation timed out
* Closing connection 0
curl: (7) Failed to connect to redacted.herokuapp.com port 443: Operation timed out
Run Code Online (Sandbox Code Playgroud)

更新:这变得越来越奇怪。我关闭了我的 iOS 模拟器,让我的电脑休息了 10 分钟。回来了,只是尝试了简单的 curl 请求,它奏效了。启动了 iOS 模拟器,现在我的 curl 请求超时。

更新:我怀疑这与 Heroku 上的 actioncable 阻塞请求有关。尝试禁用所有 websockets 并再次测试。


更新:为了查看它是否是特定于应用程序的,我创建了一个全新的 React Native 应用程序和一个全新的 Rails API。

API 步骤

  • rails new my_api --api
  • 删除 sqlite3 并添加 pg gem
  • 更新的数据库.yml
  • 添加“健康”状态 ok 端点(控制器 + 路由)
  • 部署到heroku

移动应用程序步骤

  • 创建新的 React Native 应用程序
  • 添加一个 setInterval 请求componentDidMount以从 Rails API 中获取
  • 在 await 之前和之后放置一个 console.log
  • 按控制台上的刷新(“r”)以刷新应用程序
  • 刷新应用 ~10 次
  • 请求在某个时候挂起

我彻底输了...