.nu​​mChildren() 总是返回 0

.numChildren() always returning 0

我正在按照 likes 示例进行操作

使用它们的确切结构,但用于不同的目的:

/functions-project-12345
    /db
        /1
            contacts_count: 0
            /contacts
                1: true
                2: true
                3: true

contacts_count 在正确的位置创建,虽然由于某些原因,contacts_count 保持 returning 0

exports.contactsCount = functions.database.ref('/db/{userid}/contacts').onWrite(event => {
    return event.data.ref.parent.child('contacts_count').set(event.data.numChildren());
});

我也试过在 /db/{userid}/contacts/{id} 设置触发器,在阅读了所有文档之后,我似乎仍然无法 return 正确计数。

事实上,具有与喜欢的示例完全相同的结构:

/functions-project-12345
    /posts
        /key-123456
            likes_count: 32
            /likes 
                user123456: true
                user456789: true
                user786245: true
服务器上的

和 运行:

exports.countlikes = functions.database.ref('/posts/{postid}/likes').onWrite(event => {
  return event.data.ref.parent.child('likes_count').set(event.data.numChildren());
});

仍然保存0likes_count

event.dataevent.data.numChildren() 中是对 /db/{userid}/contacts 节点的引用,对吗?

更新 04/13/17:以下解决方案仅在您可以保证仅添加(不删除或更改)子节点并且不处理被删除的计数节点时才有效。如需更强大的解决方案,请查看更新后的 child count example in the firebase/functions-samples repo.

我不确定你的代码到底出了什么问题(我刚刚测试了这个例子,它对我有用),但是做同样事情的更安全的方法是使用 transaction() 而不是放()。修改您提供的示例代码,如下所示:

exports. contactsCount = functions.database.ref('/db/{userid}/contacts')
  .onWrite(event => {
    var contactCountRef = event.data.ref.parent.child('contacts_count');
    return contactCountRef.transaction(function(currentCount) {
      return (currentCount || 0) + 1;
    });
  });

此代码应该对您有用,因为它不依赖于您 运行 使用 numChildren() 遇到的任何问题,而且它还有一个额外的好处,即可以避免出现在 numChildren() 中的竞争条件官方样本。我们实际上正在努力更新示例以正确使用事务。