Firebase Cloud Functions - 使用 onWrite 事件更新值

Firebase Cloud Functions - Update a value using onWrite event

有一个用户可以在其中对另一个用户的图片进行评分的应用程序,我想计算一个用户收到的总票数。我发现使用 Firebase 实现此目标的最佳方法是控制 'onWrite' 事件并在每个用户收到投票时手动更新计数器。

我发现以下代码的问题是 'votesCount' 没有在第一个 'onWrite' 事件中准确更新,但在下一个 'onWrite' 事件中更新与以前用户的费率。为什么会这样?这是投票应用程序的好方法吗?

下面方法的目的是检查被投票的用户是否有'votes_count',如果为真,则将新值添加到旧值,否则只添加新值。

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 来增加值。您也没有 return 值,因此您的函数会超时。返回在 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
     }
  })
})

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