Firebase数据库插入数据函数意外无限循环该如何解决
问题成因
- 你使用了
ref.on("value", callback)来监听数据库根节点的数值变化,这个方法是持续监听器:只要根节点下的数据发生变更,就会触发绑定的回调函数。 - 你的回调逻辑里执行了向
notes/路径写入新数据的操作,写入操作会触发根节点的value事件,再次执行回调,回调又写入新数据,就形成了无限循环。 - 额外存在的逻辑隐患:用全局最大值加1的方式生成ID,高并发下会出现ID冲突,且每次读取全量notes数据的开销会随数据量增长持续升高。
修复方案
方案1:将持续监听改为单次读取
把ref.on()替换为ref.once(),该方法只会读取一次数据,不会持续监听后续变化,写入操作不会再次触发回调,修改后代码如下:
function insertDaten(titel) { var ref = firebase.database().ref(); // 把on改为once,仅执行一次读取 ref.once("value", function (snapshot) { var json_elemente = snapshot.val().notes || {}; // 兼容notes为空的场景,避免后续逻辑报错 var keys = Object.keys(json_elemente); var count = keys.length === 0 ? 1 : Math.max.apply(null, keys) + 1; firebase.database().ref("notes/" + count).set({ id: parseInt(count) + 1, text: "", titel: titel, bild: "" }); }); }
方案2(更推荐):使用Firebase自带的push方法生成唯一ID
Firebase Realtime Database自带push()方法,会自动生成时序唯一的ID,不需要手动计算最大值,完全避免ID冲突和全量读取的问题,代码更简洁稳定:
function insertDaten(titel) { // 直接在notes节点下生成新的唯一子节点 const newNoteRef = firebase.database().ref('notes').push(); newNoteRef.set({ id: newNoteRef.key, // 直接使用push生成的唯一ID text: "", titel: titel, bild: "" }); }
内容的提问来源于stack exchange,提问作者Holunk
相关产品推荐
相关产品推荐

