.numChildren() 总是返回 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());
});
仍然保存0到likes_count
event.data
在 event.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()
中的竞争条件官方样本。我们实际上正在努力更新示例以正确使用事务。
我正在按照 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());
});
仍然保存0到likes_count
event.data
在 event.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()
中的竞争条件官方样本。我们实际上正在努力更新示例以正确使用事务。