reactjs Firebase v9.01 -未经处理的拒绝(类型错误):productDoc. ref.集合不是函数

b09cbbtk  于 2022-11-22  发布在  React
关注(0)|答案(2)|浏览(138)

我在从firestore获取数据时遇到了一个问题。我真的不明白为什么productDoc.ref下没有一个收集函数,如果有人能帮助我,我将非常感激。
我使用的是最新版本的Firebase,但是如果我按照firebase v9的文档操作,我仍然无法访问prices子集合。

useEffect(() => {
  const q = query(collection(db, "products"), where("active", "==", true));
  // console.log(db.collection("products").getDocuments());
  const unsub = onSnapshot(q, (querySnapshot) => {
    const products = {};
    querySnapshot.forEach(async (productDoc) => {
      products[productDoc.id] = await productDoc.data();
      console.log(await productDoc, "ref");

      const priceSnap = await productDoc.ref.collection("prices").get();
      priceSnap.doc.forEach((price) => {
        products[productDoc.id].price = {
          priceId: price.id,
          priceData: price.data(),
        };
      });
    });
    setProducts(products);
  });
}, []);

3zwtqj6y

3zwtqj6y1#

您不能从模块化API中的DocumentReference对象链接collection调用。
您需要将DocumentReference传递给对顶级collection函数的调用:

const priceSnap = await getDocs(collection(productDoc.ref, "prices"));
zlhcx6iw

zlhcx6iw2#

我发现Frank的代码仍然不能正常工作,因为forEach内部的await将不按预期运行。您必须用for循环替换forEach。
在深入研究了几天之后,我发现下面的代码是有效的。

useEffect(() => {
    const q = query(collection(db, "products"), where("active", "==", true));
    const unsub = onSnapshot(q, async (querySnapshot) => {
      const products = {};
      for (const productDoc of querySnapshot.docs) {
        products[productDoc.id] = productDoc.data();
        const priceSnap = await getDocs(collection(productDoc.ref, "prices"));
        for (const price of priceSnap.docs) {
          products[productDoc.id].price = {
            priceId: price.id,
            priceData: price.data(),
          };
        }
      }
      setProducts(products);
    });
    return () => unsub();
  }, []);

相关问题