有了一个用户可以在其中对其他用户图片进行评分的应用程序,我希望统计一个用户已收到的总投票数。我发现用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
      },
      ...
   ]

最佳答案

不,您应该使用transaction递增值。您也没有返回值,因此您的函数将超时。在Cloud Functions中返回是必要的。

您的代码应如下所示:

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
     }
  })
})


但是,我无法测试代码,但是我认为它应该可以工作。请注意,当用户将值添加到给定路径时,该值将增加,而当用户在给定路径中删除时,该值将减少。可以像我在示例中所说的那样轻松更改。

关于javascript - Firebase Cloud Functions-使用onWrite事件更新值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45632876/

10-13 00:16