Firebase.db.collection 不是函数 || Firebase v9 ||将集合文档设置为状态时引发错误

Posted

技术标签:

【中文标题】Firebase.db.collection 不是函数 || Firebase v9 ||将集合文档设置为状态时引发错误【英文标题】:Firebase.db.collection is not a function || Firebase v9 || throws error when setting collection documents to state 【发布时间】:2022-01-20 06:58:24 【问题描述】:

我正在使用 Firebase v9 开发 Expo React Native 项目。出于某种原因,我能够收听 Firestore 中的“聊天”集合并成功地控制台记录它们或将它们设置为变量,但是一旦我尝试将它们设置为一个状态,我就会收到此错误:

“TypeError:_firebase.db.collection 不是函数。(在 '_firebase.db.collection("chats")' 中,'_firebase.db.collection' 未定义)”

例如,这个 useEffect 正确地将我想要的对象数组打印到控制台:

useEffect(
    () =>
      onSnapshot(collection(db, "chats"), (snapshot) =>
        console.log(
          snapshot.docs.map((doc) => (
            id: doc.id,
            data: doc.data(),
          ))
        )
      ),
    []
  ); 

但是,一旦我将 console.log 换成 setChats,就会出现上述错误。

useEffect(
    () =>
      onSnapshot(collection(db, "chats"), (snapshot) =>
        setChats(
          snapshot.docs.map((doc) => (
            id: doc.id,
            data: doc.data(),
          ))
        )
      ),
    []
  );

我也正确地从 React 导入了 useState。我还可以将这些快照文档设置为一个变量,但如果我尝试使用该变量设置状态(即:setChats(myVar);),我会收到此错误。

我已经被困在这个问题上好几个小时了,我一生都无法理解为什么会出现这个错误。有任何想法吗?谢谢! ????

【问题讨论】:

【参考方案1】:

也许尝试初始化一个空数组并将您的文档推送到它。然后设置聊天(数组)。像这样的...

useEffect(
const data = []
    () =>
      onSnapshot(collection(db, "chats"), (snapshot) =>
        
          snapshot.docs.map((doc) => (
            data.push(id: doc.id,
            data: doc.data(),)
            
          )
          setChats(data)
        )
      ),
    []
  );

【讨论】:

【参考方案2】:

将数据推入数组然后进入使用状态对我有用

  useEffect(() => 
    const q = query(collection(db, 'posts'))
    onSnapshot(q, (querySnapshot) => 
      const posts = []
      querySnapshot.forEach((doc) => 
        posts.push( id: doc.id, data: doc.data() )
      )

      setPosts(posts)
    )
  , [])

【讨论】:

以上是关于Firebase.db.collection 不是函数 || Firebase v9 ||将集合文档设置为状态时引发错误的主要内容,如果未能解决你的问题,请参考以下文章

既不是 URL 也不是 URN 的 URI 是不是存在?

JsonMappingException:不是地图,不是数组或不是枚举

检查键盘输入是不是为空或不是“Y”或不是“X”

'gradlew' 不是内部或外部命令,也不是可运行的程序

C下标值既不是数组也不是指针也不是向量

如何检查字符串是不是至少包含一个数字、字母和既不是数字也不是字母的字符?