2017-08-11 42 views
1

拥有一个用户可以对其他用户图片进行评分的应用程序,我希望计算出用户收到的总投票数。我发现用Firebase实现这一目标的最佳方式是控制'onWrite'事件并在收到投票时为每个用户手动更新计数器。Firebase云端功能 - 使用onWrite事件更新值

我用下面的代码发现的问题是'votesCount'没有在第一个'onWrite'事件上更新,但是它在下一个'onWrite'事件中更新,并且以前用户的速度。这是为什么发生?这是一个投票应用程序的好方法吗?

以下方法的目的是检查投票用户是否有'votes_count',如果为true,则将新值添加到旧值,在相反的情况下只需添加新值。

exports.updateVotesCount = functions.database.ref('/votes/{id}').onWrite(event => { 
    const data = event.data.val(); 
    var votesCount = admin.database().ref('/profiles/' + data.to).child('votes_count'); 
    votesCount.once('value').then(function(snapshot) { 
     if (snapshot.val()) { 
     votesCount.set(snapshot.val() + data.rate); 
     } else { 
     votesCount.set(data.rate); 
     } 
    }); 
}); 

这是我使用的数据结构方面:

{ 
    profiles: [ 
     userId: { 
     name: "...", 
     image: "...", 
     votes_count: "..." 
     }, 
     ... 
    ], 
    votes: [ 
     voteId: { 
     from: "userId", 
     to: "userId", 
     rate: n 
     }, 
     ... 
    ] 

回答

1

不,你应该使用transaction递增值。你也没有返回一个值,所以你的函数会超时。返回在云端函数中是必需的。

您的代码应该是这样的:

exports.updateVotesCount = functions.database.ref('/votes/{id}').onWrite(event => { 
    const data = event.data.val(); 
    return admin.database().ref('/profiles/' + data.to).child('votes_count').transaction(function(votes) { 
    if (event.data.exists()){ //If there is a onCreate action (user adds a vote) or use your own snapshot.val() 
      return (votes || 0) + 1; //providing a default "0" value if there is no value 
     }else{ // if there is a onDelete action (user removes avote) 
      return (votes || 1) - 1; //providing a default "1" value if there is no value 
    } 
    }) 
}) 

我然而,不是测试代码,但我认为它应该工作...请注意,当用户添加一个值到给定的值将递增路径,当用户在给定的路径上移除时,该值将递减,但您可以像我在示例中所说的那样轻松地更改这个值。

+0

非常感谢,这似乎是一大步,现在我可以使用事务正确更新它,唯一的一点是该函数正在打印“错误序列化返回值:TypeError:将圆形结构转换为JSON”安慰。我不知道为什么自“票”应始终是一个浮动值。 –

+1

@AlejandroMoránO男孩,如果你能解决这个错误,你是我的英雄。我在Github上提问:https://github.com/firebase/functions-samples/issues/193,并且有一种解决方法......我认为这是Firebase中的一个错误,应该尽快解决。 –

+0

是的,它似乎是根据这个答案的Firebase错误:https://github.com/firebase/functions-samples/issues/193#issuecomment-317884437返回值是一个TransactionResult并且不能被序列化,这是一个解决方法。 –

相关问题