Firebase Firestore 读取操作非常高

Posted

技术标签:

【中文标题】Firebase Firestore 读取操作非常高【英文标题】:Firebase firestore read operation very high 【发布时间】:2022-01-10 08:54:45 【问题描述】:

所以基本上我使用 react 和 firebase firestore 为后端制作了一个 CRUD 应用程序。 我的写和删除操作都很好,没有问题。

但是我的读取操作有问题。

我的网站正在使用 useEffect 从 firebase 的集合中获取所有文档。所以这只在第一次安装时运行(当我的网络第一次加载时)以及当我在执行删除和创建操作时更改“用户”值时运行

这是我的代码:

useEffect(() => 
    const getUsers = async () => 
      const querySnapshot = await getDocs(collection(db, "cobadata"));
      setUsers(querySnapshot.docs.map((doc)=> (...doc.data(), id: doc.id)))
    ;
    getUsers();
  , [users]);

我知道有什么问题,但是当我测试网络时,我得到了一个非常高的读取操作,就像我在我的网站上所做的每一个读取操作一样,它在 firebase 中得到了一百次操作。我可以在我的 firebase 控制台中看到这一点,当我在我的 firebase 控制台中使用网络时,就像 5 分钟一样,读取操作达到 20k

谁能帮我解决这个问题,谢谢!

【问题讨论】:

【参考方案1】:

你没有在这里展示你所有的代码,所以我需要做一些猜测。

您的useEffect 有一个依赖数组,现在设置为[users]。这意味着每次变量 users 更改时,您的 useEffect 都会重新渲染。在您的useEffect 中,然后通过setUsers 函数为users 设置一个新值。即使您从 firebase 返回的关于当前用户的值相同,每次读取数据时仍会创建一个新数组。 (querySnapshot.docs.map((doc)=> (...doc.data(), id: doc.id)))。 React 只进行了浅层比较,这意味着对象引用已更改,因此 users 在每次渲染时都不同。

首先,您需要决定何时运行 useEffect 以及应该触发它的内容。如果变量users 的更改不是检查的正确位置,那么我将从依赖数组中删除users

一种解决方案可能是将效果中的功能移动到它自己的功能中,并将其包装在useCallbac 中。然后,您可以在初始加载时从“useEffect”调用此函数,然后在删除或创建用户时简单地加载效果。像这样的。

const getUsers = useCallback(async () => 
        const querySnapshot = await getDocs(collection(db, "cobadata"));
        setUsers(querySnapshot.docs.map((doc)=> (...doc.data(), id: doc.id))) 
    , [collection])
    
    useEffect(() => 
        getUsers()
    , [getUsers]);

    const createUser = () => 
        ...
        getUsers()
    

    const deleteUser = () => 
        ...
        getUsers()
    

(PS!我建议将 eslint-plugin-react-hooks 添加到您的 eslint-config 中。如果您的钩子使用错误,这会给您一些警告)

【讨论】:

我已经解决了这个问题,但仍然不知道上面代码的问题所在或原因。看到这个答案真的有助于我理解我的代码是如何工作的。谢谢先生!

以上是关于Firebase Firestore 读取操作非常高的主要内容,如果未能解决你的问题,请参考以下文章

firebase Firestore 文档已读取

为啥 firebase_firestore 安全规则不适用于文档读取

Firestore 定价 - Firebase 控制台中的 CRUD 是不是重要?

Firebase Firestore 读取和定价

Firebase Firestore 快照读取计数

firebase firestore以斜角读取特定文档