【问题标题】:Can't update firebase collection field - Expected type 'ya', but it was: a custom Ia object无法更新 firebase 集合字段 - 预期类型为“ya”,但它是:自定义 Ia 对象
【发布时间】:2023-01-10 23:44:01
【问题描述】:

我正在尝试制作理发店网络应用程序,客户可以在其中查看免费约会列表,当他们预订免费约会时,我想从 firebase 中删除该字段。

我有一个代表一个理发师的集合。 这就是它在 Firebase 中的样子。

如您所见,radno_vrijeme 是 firebase 中的对象或映射,其中包含 6 个数组,每个数组中都有空闲工作时间列表。

在我的函数中,除了需要更新 firebase 集合的最后一行,我可以做所有事情。

  const finishReservation = async () => {
    try {
      const freeTimeRef = collection(db, `${barber}`);
      const q = query(freeTimeRef);
      const querySnap = await getDoc(q);
      querySnap.forEach(async (doc) => {
        const radnoVrijeme = doc.data().radno_vrijeme;

        // Find the index of the hour you want to delete
        const index = radnoVrijeme["Mon"].indexOf(hour);
        // Remove the hour from the array
        radnoVrijeme["Mon"].splice(index, 1);
        // Update the document in the collection
        console.log(radnoVrijeme);
        const radnoVrijemeMap = new Map(Object.entries(radnoVrijeme));
        await freeTimeRef.update({ radno_vrijeme: radnoVrijemeMap });
      });
    } catch (error) {
      console.log(error);
    }
  };

我试图将它作为 JSON 字符串化对象传递,但没有成功。我总是收到这个错误:

“FirebaseError:预期类型为‘ya’,但它是:自定义 Ia 对象”

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    当您尝试使用集合引用或查询获取多个文档时,您必须使用getDocs()

    const finishReservation = async () => {
      try {
        const freeTimeRef = collection(db, `${barber}`);
        const q = query(freeTimeRef);
        const querySnap = await getDocs(q);
        
        const updates = [];
        
        querySnap.forEach((d) => {
          const radnoVrijeme = d.data().radno_vrijeme;    
          const index = radnoVrijeme["Mon"].indexOf(hour);
          radnoVrijeme["Mon"].splice(index, 1);
        
          const radnoVrijemeMap = new Map(Object.entries(radnoVrijeme));
          
          updates.push(updateDoc(d.ref, { radno_vrijeme: radnoVrijemeMap }))
        });
        
        await Promise.all(updates);
        console.log("Documents updated")
      } catch (error) {
        console.log(error);
      }
    };
    

    getDoc() 用于使用文档引用获取单个文档。

    【讨论】:

    • @avuji31 是的。您不能将 getDoc() 与集合引用一起使用。我已经用完整的函数更新了我的答案。你能试着运行它吗?
    • @avuji31 对。你能试试更新后的声明吗?所以原来的问题确实是getDoc()
    • FirebaseError:使用无效数据调用函数 updateDoc()。不支持的字段值:自定义地图对象(在文档 Ana Lončar/pBrrw16ZIO5UeFhfhBDv 的字段 radno_vrijeme 中找到)
    • @avuji31 那是一个完全不同的问题。为什么不尝试 { radno_vrijeme: radnoVrijeme } 并删除 radnoVrijemeMap 逻辑?我在那里看不到它的用例
    • 由于 chatGPT,我尝试了这个解决方案,我尝试了很多东西。它现在可以工作了,但我也试过 radno_vrijeme : radnoVrijeme,但它没有工作,现在它可以与你的代码一起工作。它具有更新功能,正如我所说的,除了更新行外,一切正常。谢谢
    猜你喜欢
    • 2022-01-05
    • 2022-01-02
    • 2022-07-05
    • 1970-01-01
    • 2022-06-10
    • 2019-11-30
    • 2023-04-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多