使用TypeScript更新Firebase实时数据库多路径时遇路径冲突问题
解决Firebase实时数据库多路径更新的层级冲突问题
问题根源
Firebase Realtime Database的update()方法不允许在同一个更新对象中同时包含祖先路径和其子路径,因为这会产生数据覆盖的歧义:更新祖先节点会替换整个节点的内容(包括所有子节点),但同时又要更新子节点,系统无法判断最终应该保留哪部分数据。
解决方案
根据你的实际需求,分两种情况处理:
情况1:需要同时更新祖先节点字段和子节点内容
不要将整个updateMap直接赋值给祖先路径karte/aktuell/34,而是把祖先节点下的每个字段拆成单独的路径键,与子路径分开定义:
const dMap: { [key: string]: any } = {}; // 单独指定祖先节点下的每个字段路径 const artikelKeys = new table.DB_artikel(); dMap[`${urlToCurrentEvent}/${artikelKeys.anzahlVerfugbar()}`] = bestand; dMap[`${urlToCurrentEvent}/${artikelKeys.visible()}`] = visible; // 添加子路径的更新内容(替换为你的子路径变量和对应更新数据) dMap[urlToChildEvent] = childUpdateData;
这样每个更新路径都是独立的,不存在层级冲突,Firebase可以正常执行批量更新。
情况2:误添加了祖先路径,实际只需要更新子节点
如果karte/aktuell/34的更新是多余的,直接删除dMap[urlToCurrentEvent] = updateMap这一行,只保留子路径的更新即可:
const dMap: { [key: string]: any } = {}; // 只保留子路径的更新 dMap[urlToChildEvent] = updateMap;
验证
修改后,你的dMap应该类似这样(无层级冲突的路径):
'karte/aktuell/34/anzahlVerfugbar': 0,
'karte/aktuell/34/visible': false,
'karte/aktuell/34/artikel_inventar/34': { ...子节点数据 }
内容的提问来源于stack exchange,提问作者Amschti
相关产品推荐
相关产品推荐

