2017-03-11 152 views
0

我下面用它们的确切结构likes例如.numChildren()总是返回0

,但出于不同的目的:

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

CONTACTS_COUNT得到在正确的位置创建的,虽然由于某些原因,CONTACTS_COUNT保持返回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}处设置触发器,并且在读完所有文档后,仍然无法使其返回正确的计数。

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

/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()); 
}); 

仍然保存成likes_count

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

+0

嗨,我也有同样的结果。 –

回答

2

UPDATE 04/13/17:下面的解决方案仅适用于您可以保证只添加(未删除或更改)子节点并且不处理要删除的计数节点的情况。要获得更强大的解决方案,请查看更新的child count example in the firebase/functions-samples repo

我不确定你的代码到底出了什么问题(我刚刚测试过这个例子,它适用于我),但更安全的方法是使用transaction()而不是set()。修改您所提供的示例代码,这将是这样的:

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(),它具有的是从安全的额外好处官方样本中存在的竞争条件。实际上,我们正致力于更新示例以正确使用事务。