为什么Firebase事件会在第二个及后续事件中返回空对象?

时间:2018-01-12 05:15:49

标签: python events firebase-realtime-database

我在服务器上有一个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中的正确位置。

为什么在第一次下载数据库之后,在后续事件中出现空事件对象?

1 个答案:

答案 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示例才有效,而其他示例不应该使用。