Firebase云计算儿童大小的功能

时间:2017-12-13 23:16:14

标签: javascript firebase firebase-realtime-database google-cloud-functions

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参考,但仍然有点混淆为什么我无法获得字符串值。

我想我正在寻找一些可以解决的例子。

1 个答案:

答案 0 :(得分:5)

这里出了很多问题。

从日志中可以看出,event.data.val是一个功能。您需要致电val()以从更改的位置获取JavaScript对象:event.data.val()

第二件事:当您已经知道要查询的位置的绝对路径时,不确定为什么要使用currentRef.parent.parent.child。您可以直接到达那里:

currentRef.root.ref(`/Uploads/Posts/${postID}/`)

第三件事,您在使用单引号时尝试使用变量插值来构建此字符串:/Uploads/Posts/{postID}/。您需要使用反引号,并在其中使用$ {}来插入变量(您将省略$)。

最后,您应该使用事务来执行写操作,正如您在其他示例代码中看到的那样,因为在尝试更改相同位置时,两个函数完全可以同时运行。我不建议把它留下来。