You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase集合字段更新报错:类型不匹配问题求助

Firebase集合字段更新报错:类型不匹配问题求助

嘿,我来帮你排查这个问题!你现在开发理发店预约APP,想删除Firebase中理发师文档里的空闲时段,结果遇到了类型不匹配的报错对吧?咱们一步步来解决:

问题根源分析

你看到的报错 FirebaseError: Expected type 'ya', but it was: a custom Ia object,核心原因是Firebase Firestore不支持直接存储JavaScript的Map对象,它只接受普通的JS对象(Plain Object)。你代码里把处理后的radnoVrijeme转成了Map,这就导致Firestore识别不了这个类型。

另外还有两个小问题需要修正:

  • getDoc(q)是用来获取单个文档的,查询集合应该用getDocs(q)
  • 集合引用freeTimeRef没有update方法,必须拿到单个文档的引用才能执行更新操作

修正后的代码

下面是调整后的完整代码,我标注了关键修改点:

const finishReservation = async () => {
  try {
    const freeTimeRef = collection(db, `${barber}`);
    const q = query(freeTimeRef);
    // 把getDoc改成getDocs,用于获取集合下的所有文档
    const querySnap = await getDocs(q);

    // 建议用for...of替代forEach处理异步操作,避免异步遍历的时序问题
    for (const doc of querySnap.docs) {
      const radnoVrijeme = doc.data().radno_vrijeme;
      const targetDay = "Mon"; // 这里可以根据实际预约的日期动态设置
      const index = radnoVrijeme[targetDay].indexOf(hour);

      // 先判断index是否有效,避免splice出错(比如hour不存在的情况)
      if (index !== -1) {
        radnoVrijeme[targetDay].splice(index, 1);
        
        // 直接传普通JS对象,不需要转成Map
        // 用doc.ref获取当前文档的引用,调用update方法
        await doc.ref.update({ radno_vrijeme: radnoVrijeme });
        console.log("空闲时段已成功删除");
      } else {
        console.log("未找到该空闲时段");
      }
    }
  } catch (error) {
    console.error("更新失败:", error);
  }
};

额外注意事项

  1. 异步遍历问题:原来的forEach里用async函数会导致遍历和异步操作不同步,改用for...of可以保证每个文档的更新操作按顺序执行,也更便于错误处理。
  2. 时段存在性校验:加了index !== -1的判断,避免用户选择的时段不存在时触发错误。
  3. 动态日期处理:代码里的targetDay写死成了"Mon",实际开发中可以根据用户选择的预约日期动态传入对应的键(比如"Tue"、"Wed"等)。

备注:内容来源于stack exchange,提问作者avuji31

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:07:44