在firebase cloud functions API reference之后,我正在努力实现count increase/decrease:
Uploads/
- Posts/
- post_1
- post_2
...
- Likes/
- post_1/
- Number: 4
- post_2/
- Number: 2
...
和
exports.LikeCount= functions.database.ref('/Posts/{postID}').onWrite(event => {
const Ref = event.data.ref;
const postID = event.params.postID;
const likeCount= Ref.parent.parent.child('/Likes/' + postID + '/Number');
return likeCount.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (current || 0) + 1;
}else if (!event.data.exists() && event.data.previous.exists()) {
return (current || 0) - 1;
}
}).then(() => {
console.log("Done");
});
});
除了地点之外,它与给出的例子相同。
它还会给another example,如果删除了喜欢的数量,那么它会重新计算喜欢(子)的数量。
这是我的版本(或者至少是它的想法),它检查喜欢的数量,如果它小于1,则重新计算它。 (仅仅因为如果喜欢的数量不存在,第一个函数将给出1而不管出现的喜欢数量。)
exports.reCount= functions.database.ref('/Likes/{postID}/Number').onUpdate(event => {
const value = event.data.val;
//If the value is less than 1:
if (value <= 1) {
const currentRef = event.data.ref;
const postID = event.params.postID;
const postRef = currentRef.parent.parent.child('/Uploads/Posts/{postID}/');
return postRef.once('value')
.then(likeData=> currentRef.set(likeData.numChildren()));
}
});
使用第二个函数,我尝试使用以下Number
获取event.data.val
值,其中[Function: val]
在FB日志中给出currentRef.parent.parent.child('/Uploads/Posts/{postID}/').numChilren();
,我认为我会得到字符串值。< / p>
... TypeError: collectionRef.numChildren is not a function
给了apply
。
我阅读了大量的在线教程和API参考,但仍然有点混淆为什么我无法获得字符串值。
我想我正在寻找一些可以解决的例子。
答案 0 :(得分:5)
这里出了很多问题。
从日志中可以看出,event.data.val
是一个功能。您需要致电val()以从更改的位置获取JavaScript对象:event.data.val()
第二件事:当您已经知道要查询的位置的绝对路径时,不确定为什么要使用currentRef.parent.parent.child
。您可以直接到达那里:
currentRef.root.ref(`/Uploads/Posts/${postID}/`)
第三件事,您在使用单引号时尝试使用变量插值来构建此字符串:/Uploads/Posts/{postID}/
。您需要使用反引号,并在其中使用$ {}来插入变量(您将省略$)。
最后,您应该使用事务来执行写操作,正如您在其他示例代码中看到的那样,因为在尝试更改相同位置时,两个函数完全可以同时运行。我不建议把它留下来。