代码之家  ›  专栏  ›  技术社区  ›  grigy

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

  •  3
  • grigy  · 技术社区  · 6 年前

    我在建一个 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 回复  |  直到 6 年前
        1
  •  0
  •   Mapsy    6 年前

    我对这个问题没有一个确切的解决方案,但我意识到我与他人互动的方式 firebase 使我的申请更容易受到影响。也许你能在你的项目中发现我自己的一些设计缺陷?

    我发现我在打电话 initializeApp 外面 try/catch ,这意味着每当遇到错误时,整个JavaScript模块都会失败。因此,第一个解决方法是正确地安全地处理初始化。

    第二,这个错误在我给客户打电话的方式上变得很明显 firestore() .例如,我第一次打电话给 firebase.firestore() 嵌入在返回 Promise ,即:

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

    现在,使用这种方法,如果 firestore 失败之前 许诺 可能会被退回,但实际上我们没有 catch 错误!这是因为它在链条中发生得太早,不适合一个 许诺 待创建。这也意味着,应用程序似乎会在比应用程序内部可能捕获到的东西更深层次上失败。但那是错的!

    正确的实现是将交互包装为 火力基地。firestore() 在一分钟之内 许诺 第一:

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

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

    推荐文章