蹉跎莫遣韶光老,人生唯有读书好。这篇文章主要讲述Firebase Firestore:无法访问Firestore后端(仅限Android)相关的知识,希望能为你提供帮助。
我正在使用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
eact-nativeLibrariesReactNativeYellowBox.js:71:16 in error
- node_modules@firebaseloggerdistcjssrclogger.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:UsersgrigorDocumentsBitbucketAwesomeProject and restart.
21:51:08: Finished building javascript bundle in 26098ms
21:51:14: Running app on XT1053 in development mode21:51:34: [2018-05-25T04:51:26.597Z]@firebase/firestore:, Firestore (4.10.1): Could not reach Firestore backend.
- node_modules
eact-nativeLibrariesReactNativeYellowBox.js:71:16 in error
- node_modules@firebaseloggerdistcjssrclogger.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
eact-nativeLibrariesReactNativeYellowBox.js:82:15 in warn
- node_modules
eact-nativeLibrariesCoreTimersJSTimers.js:254:8 in setTimeout
- node_modules@firebaseauthdistauth.js:37:577 in Hc
* null:null in <
unknown>
- node_modules@firebaseauthdistauth.js:15:932 in y
- node_modules@firebaseauthdistauth.js:37:606 in Ic
- node_modules@firebaseauthdistauth.js:210:0 in kk
- node_modules@firebaseauthdistauth.js:209:665 in start
- node_modules@firebaseauthdistauth.js:215:38 in Dk
- node_modules@firebaseauthdistauth.js:253:425 in ql
- node_modules@firebaseauthdistauth.js:255:146 in <
unknown>
- node_modules@firebaseauthdistauth.js:19:220 in <
unknown>
* null:null in Gb
* null:null in Cb
- node_modules@firebaseauthdistauth.js:22:103 in Sb
- node_modules@firebaseauthdistauth.js:15:643 in jb
- ... 10 more stack frames from framework internals
答案我没有针对这个问题的确切解决方案,但我意识到我与
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 =>
...);
【Firebase Firestore(无法访问Firestore后端(仅限Android))】希望这在某种程度上有所帮助。我知道这是一个棘手的问题!
推荐阅读
- Android依赖库必须完全相同
- 在android中使用mapsforge的离线地图
- Apple Maps使用哪种SRID()
- 添加对Yeoman Webapp生成器的支持较少
- Android - OnTouchListener如果已按下屏幕则不会触发
- 如何从android中重定向url加载图像
- Android(无法从mysql数据库中检索图像URL并将其显示在imageView中)
- ImageView在android中不起作用
- 如何在android中使用SwipeRefreshLayout和imageView进入NestedScrollView