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); } };
额外注意事项
- 异步遍历问题:原来的
forEach里用async函数会导致遍历和异步操作不同步,改用for...of可以保证每个文档的更新操作按顺序执行,也更便于错误处理。 - 时段存在性校验:加了
index !== -1的判断,避免用户选择的时段不存在时触发错误。 - 动态日期处理:代码里的
targetDay写死成了"Mon",实际开发中可以根据用户选择的预约日期动态传入对应的键(比如"Tue"、"Wed"等)。
备注:内容来源于stack exchange,提问作者avuji31
相关产品推荐
相关产品推荐

