Firebase Firestore:无法访问Firestore后端(仅限Android)

时间:2018-05-24 05:40:46

标签: android firebase react-native google-cloud-firestore create-react-native-app

我正在使用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 :(得分:0)

我没有确切的解决方案,但是我意识到与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 =>...);

希望这会有所帮助。我知道这是一个棘手的问题!