Firebase Firestore: не удалось связаться с бэкэндом Firestore (только для Android) - PullRequest
0 голосов
/ 24 мая 2018

Я создаю приложение react-native, используя Create React Native App.Для бэкэнда он использует Firebase Firestore.Приложение прекрасно работает на iOS, но не работает со следующей ошибкой на Android (как с симулятором, так и на устройстве) при попытке извлечь данные из серверной части:

22:02:37: [2018-05-22T05:02:33.751Z]  @firebase/firestore:, Firestore (4.10.1): Could not reach Firestore backend.
- node_modules\react-native\Libraries\ReactNative\YellowBox.js:71:16 in error
- node_modules\@firebase\logger\dist\cjs\src\logger.js:97:25 in defaultLogHandler
- ... 18 more stack frames from framework internals

Любая идея, в чем может быть проблема и какотладить это?

Ошибка кажется общей, поскольку есть другие вопросы с тем же сообщением об ошибке.Но в данном случае это относится только к Android.

Полный журнал и трассировка стека:

21:50:51: Warning: Expo version in package.json does not match sdkVersion in manifest.
21:50:51:
21:50:51: If there is an issue running your project, please run `npm install` in C:\Users\grigor\Documents\Bitbucket\AwesomeProject and restart.
21:51:08: Finished building JavaScript bundle in 26098ms
21:51:14: Running app on XT1053 in development mode

21:51:34: [2018-05-25T04:51:26.597Z]  @firebase/firestore:, Firestore (4.10.1): Could not reach Firestore backend.
- node_modules\react-native\Libraries\ReactNative\YellowBox.js:71:16 in error
- node_modules\@firebase\logger\dist\cjs\src\logger.js:97:25 in defaultLogHandler
- ... 18 more stack frames from framework internals
21:51:37: Setting a timer for a long period of time, i.e. multiple minutes, is a performance and correctness issue on Android as it keeps the timer module awake, and timers can only be called when the app is in the foreground. See https://github.com/facebook/react-native/issues/12981 for more info.
(Saw setTimeout with duration 3299464ms)
- node_modules\react-native\Libraries\ReactNative\YellowBox.js:82:15 in warn
- node_modules\react-native\Libraries\Core\Timers\JSTimers.js:254:8 in setTimeout
- node_modules\@firebase\auth\dist\auth.js:37:577 in Hc
* null:null in <unknown>
- node_modules\@firebase\auth\dist\auth.js:15:932 in y
- node_modules\@firebase\auth\dist\auth.js:37:606 in Ic
- node_modules\@firebase\auth\dist\auth.js:210:0 in kk
- node_modules\@firebase\auth\dist\auth.js:209:665 in start
- node_modules\@firebase\auth\dist\auth.js:215:38 in Dk
- node_modules\@firebase\auth\dist\auth.js:253:425 in ql
- node_modules\@firebase\auth\dist\auth.js:255:146 in <unknown>
- node_modules\@firebase\auth\dist\auth.js:19:220 in <unknown>
* null:null in Gb
* null:null in Cb
- node_modules\@firebase\auth\dist\auth.js:22:103 in Sb
- node_modules\@firebase\auth\dist\auth.js:15:643 in jb
- ... 10 more stack frames from framework internals

1 Ответ

0 голосов
/ 26 июня 2018

У меня нет точного решения проблемы, но я понял, что способ взаимодействия с firebase сделал мое приложение более восприимчивым.Может быть, вы можете заметить некоторые из моих собственных недостатков дизайна в вашем проекте?

Что я обнаружил, так это то, что я звонил initializeApp вне try/catch, что означало, что весь модуль JavaScript будет выходить из строя всякий раз, когдаошибка обнаружена.Итак, первый обходной путь - это правильная обработка инициализации безопасно.

Во-вторых, эта ошибка стала заметной в том, как я структурировал свои вызовы на firestore().Например, мой первый вызов firebase.firestore() был встроен в метод, который возвратил Promise, то есть:

() => firebase.firestore().collection('someCollection').get().then(...).catch(e => ...);

Теперь, при таком подходе, если взаимодействие с firestore потерпел неудачу прежде, чем Promise мог быть возвращен, мы на самом деле catch не ошиблись!Это потому, что это происходит слишком рано в цепочке, чтобы создать Promise.Это означало, что опять-таки приложение, по-видимому, выходило из строя на явно более глубоком уровне, чем то, что можно было поймать внутри приложения.Но это неправильно!

Правильная реализация будет заключаться в том, чтобы обернуть взаимодействие с firebase.firestore() в Promise сначала:

return new Promise(resolve => firebase.firestore().collection(...)).then(q => ...).catch(e =>...);

Надеюсь, это поможет в некоторыхпуть.Я знаю, что это сложная проблема!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...