我在服务器上有一个Python Firebase SDK,它写入Firebase实时数据库。
我在浏览器上有一个Javascript Firebase客户端,它将自己注册为“child_added”事件的监听器。
身份验证由Python服务器处理。
使用Firebase规则允许读取,客户端侦听器获取第一个事件(该FB位置的所有数据)的数据,但只获取后续child_added事件中包含空数据的键。
以下是听众注册:
firebaseRef.on
(
"child_added",
function(snapshot, prevChildKey)
{
console.log("FIREBASE REF: ", firebaseRef);
console.log("FIREBASE KEY: ", snapshot.key);
console.log("FIREBASE VALUE: ", snapshot.val());
}
);
“REF”总是很好。
“KEY”总是很好。
但在第一次完全检索该数据库位置后,“VALUE”为空。
我尝试在listen函数中每次重新实例化firebase引用。结果相同。
我尝试了“值”事件而不是“child_added”。没有改善。
Firebase端的数据在FB控制台中看起来很完美。
以下是Python管理员将数据写入firebase的方式:
def push_value(rootAddr, childAddr, data):
try:
ref = db.reference(rootAddr)
posts_ref = ref.child(childAddr)
new_post_ref = posts_ref.push()
new_post_ref.set(data)
except Exception:
raise
正如我所说,这完全可以将数据放在FB中的正确位置。
为什么在第一次下载数据库之后,在后续事件中出现空事件对象?
答案 0 :(得分:0)
我找到了答案。像大多数事情一样,结果很简单,但花了几天时间才找到。也许这会拯救别人。
在文档页面上: http://firebase.google.com/docs/database/admin/save-data#section-push
“在JavaScript和Python中,调用push()的模式然后 立即调用set()是如此常见,Firebase SDK可以让你 通过将要设置的数据直接传递给push()as来组合它们 如下...“
我建议措辞应该强调你必须这样做。
同一页面上的早期Python示例不起作用:
new_post_ref = posts_ref.push()
new_post_ref.set({
'author': 'gracehop',
'title': 'Announcing COBOL, a New Programming Language'
})
在此示例中,单独的空push()后跟set(data)将不适用于Python和Javascript,因为在这些情况下,push()也隐式地执行set(),因此空推送会触发不需要的具有空数据的事件侦听器,以及set(数据)也没有触发带有数据的事件。
换句话说,问题中的代码是:
new_post_ref = posts_ref.push()
new_post_ref.set(data)
必须是:
new_post_ref = posts_ref.push(data)
没有显式调用set()。
由于此push()代码仅在将新对象写入FB时发生,因此初始下载到客户端不会受到影响。
虽然文档可能试图传达设计的演变,但它没有指出只有最后给出的Python和Javascript示例才有效,而其他示例不应该使用。