На днях я заметил, что некоторые вызовы API из приложения незаметно не выполняются. Я вышел из console.log до и после запроса fetch
, и вот, ожидание при выборке так и не завершилось.
// 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)
}
Будет ли завершено sh?
В журналах приложения я вижу «НАЧАТЬ», но затем я жду 2-5 минут, и обычно печатает «КОНЕЦ»
Это сервер?
Я подозревал, что это просто медленный серверный API, но, отслеживая журналы на сервере, запрос даже не отправляется в течение ~ 2 минут после «START» - и я вижу, что он отправляется / обрабатывается, когда он выводит «END»
У меня есть actioncable, подключенный к Redis, установленный в моем приложении Rails, обслуживаемый через Puma на Heroku.
Могу ли я воспроизвести это?
Это было очень сложно воспроизвести, но я могу обычно вызвать его, нажав command + R
в приложении iOS simulator, который перезагружает приложение и запускает несколько новых запросов API, которые зависают.
Что-нибудь еще?
У меня есть websock et соединение открыто с сервером. Не уверен, что это может вызвать какие-либо помехи.
Я пробовал использовать тайм-аут с 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)
curl результаты
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
Обновление: Это становится все более и более странным. Я выключил симулятор iOS и дал компьютеру отдохнуть 10 минут. Вернулся и просто попробовал простые запросы curl, и это сработало. Запустил резервную копию симулятора iOS, и теперь мой curl запрашивает таймаут.
Обновление: Я подозреваю, что это связано с запросами блокировки actioncable на Heroku. Попытка отключить все веб-сокеты и повторить тест.
Обновление: Чтобы узнать, было ли это спецификацией приложения c, я создал совершенно новое приложение React Native и совершенно новый Rails API.
Шаги API
- rails new my_api --api
- удалить sqlite3 и добавить в pg gem
- обновленный database.yml
- добавить «здоровье» status ok конечная точка (контроллер + маршрут)
- развернуть на heroku
Шаги для мобильного приложения
- создать новое собственное приложение React
- добавить запрос setInterval в
componentDidMount
для выборки из API rails - поместить console.log до и после ожидания
- нажать refre sh ("r" ) на консоли, чтобы обновить sh приложение
- refre sh приложение ~ 10 раз
- запрос зависает в какой-то момент
Я полная потеря ...