【问题标题】:Firestore snapshot listener: 'null is not an object' errorFirestore 快照侦听器:“null 不是对象”错误
【发布时间】:2020-12-28 12:34:34
【问题描述】:

这是我尝试使用 Firestore 对我的 React Native 应用程序执行的操作:

  1. 如果用户已登录,则激活快照侦听器并将值保存为状态。
  2. 如果用户退出,将状态设置为空。

当用户登录时,代码可以正常工作。但是,当用户退出时,会出现错误提示“null is not an object (evalating doc.exists)”。

下面的代码可能有什么问题?有什么建议吗?谢谢!

useEffect(()=>{
  if (user) {
    firestore().collection('points').doc(user.uid).onSnapshot(
      (doc)=>{
        if (doc.exists){
            setPoints(doc.data());
        }
        else {
            setPoints(null);
        }
      }
    )
  }
  else {
    setPoints(null);
  }
},[user]);

【问题讨论】:

  • 请编辑问题以更详细地解释哪一行代码产生了错误。此外,您应该添加代码来检查查询是否有错误。如果您有要求用户登录的安全规则,则查询将失败,而且您永远不会知道发生了这种情况。

标签: javascript reactjs firebase react-native google-cloud-firestore


【解决方案1】:

我发现这里有 2 个问题。

  1. if (user) {} 显然正在评估 true。我会通过将其更改为 if (user !== null(或 undefined 或用户退出时的任何内容)来澄清。
  2. 您的快照可能仍在侦听并抛出上述错误,因为您尚未取消订阅它。 React 文档在 cleanup from subscribe functions 上有一个很好的部分。

基本上,您需要将 onSnapshot() 包装在一个命名函数中,然后从 useEffect() 返回该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2021-03-16
    • 2023-04-08
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多