Firebase 4.12.0创建新记录后读取值始终为null的问题
解决Firebase写入后读取数据为null的问题
嘿,这个坑我之前踩过!你遇到的问题核心是异步操作的顺序问题——Firebase的set()是异步执行的,你在它还没完成数据写入时就发起了读取请求,自然拿不到数据。
问题分析
你原来的代码里,newCollab.set({songs: {}})会在后台完成数据写入,但你立刻就调用了ref.child(id).once("value")。这时候数据库里还没有生成这条记录,所以返回的data.val()就是null,哪怕键已经生成了(因为Firebase的push键是客户端本地生成的,和写入是否完成无关)。
修复方案
把读取操作放到set()完成后的回调里,利用set()返回的Promise来保证顺序:
var ref = new Firebase(FBURL + 'collaboration_songs'); var newCollab = ref.push(); // 先等待写入完成,再执行读取 newCollab.set({songs: {}}) .then(function() { var id = newCollab.key(); console.log("added record with id " + id); // 直接用newCollab引用读取,不用重新拼接路径 return newCollab.once("value"); }) .then(function(data){ var val = data.val(); console.log(val); // 现在就能拿到正确的{songs: {}}了 }) .catch(function(error) { console.error("操作出错了:", error); });
额外优化点
- 不用通过
ref.child(id)重新获取引用,newCollab本身就是你刚创建的子节点的引用,直接用它读取更简洁,也避免路径拼接错误。 - 加上
catch()捕获可能的写入或读取错误,方便排查问题。
内容的提问来源于stack exchange,提问作者Thalatta
相关产品推荐
相关产品推荐

