【问题标题】:How to get documents from collection with userid as collection name in react如何在反应中以用户ID作为集合名称从集合中获取文档
【发布时间】:2022-07-13 22:00:24
【问题描述】:

目前我想从一个集合中获取所有文档,其中当前用户的用户 ID 作为该集合的名称,用于从 firestore 做出反应。

我目前面临的问题是 react 会引发错误,因为它会在获取用户 ID 之前尝试获取集合,因此它正在为集合搜索空路径。

这是我目前用于获取集合中文档的代码:

import { useAuth, db } from '../Firebase'

...
    
const currentUser = useAuth();

useEffect(
   () =>
   onSnapshot(collection(db, 'Patienten/' + currentUser.uid + '/Patienten'), (snapshot) =>
     setPatienten(
       snapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })),
     ),
   ),
 [],
)

Firebase.js 中的相关代码:

export function useAuth() {
  const [currentUser, setCurrentUser] = useState()

  useEffect(() => {
    const unsub = onAuthStateChanged(auth, (user) => setCurrentUser(user))
    return unsub
  }, [])

  return currentUser
}

因此,此代码所做的是返回集合“Patienten//Patienten”中不存在的文档并引发错误。 这个问题有解决办法吗?

【问题讨论】:

  • 您应该在尝试使用之前检查 currentUser 是否有 Firebase 用户对象。它不会在页面加载时立即可用 - 准备就绪时将调用 auth 状态观察者回调。

标签: reactjs firebase google-cloud-firestore firebase-authentication


【解决方案1】:

听起来您的数据库效果取决于该 UID,这意味着您应该将该状态变量作为依赖项添加到 useEffect

useEffect(() => {
  if (currentUser) {
    onSnapshot(collection(db, 'Patienten/' + currentUser.uid + '/Patienten'), (snapshot) => {
      setPatienten(
        snapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })),
      ),
    })
  }),
  [currentUser]
)

您的useAuth/user 效果不应再返回当前用户,而是将其设置在currentUser 状态变量中(然后触发重新-评估您的数据库效果)。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2018-04-04
    • 2020-07-13
    • 1970-01-01
    • 2018-04-20
    • 2021-09-28
    • 2020-12-27
    • 2021-12-16
    • 2016-09-08
    相关资源
    最近更新 更多