【问题标题】:Firebase Cloud Functions - Update a value using onWrite eventFirebase Cloud Functions - 使用 onWrite 事件更新值
【发布时间】:2018-01-19 20:01:15
【问题描述】:

有一个用户可以在其中评价另一个用户图片的应用程序,我想计算一个用户收到的总票数。我发现使用 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
      },
      ...
   ]

【问题讨论】:

    标签: javascript firebase google-cloud-functions


    【解决方案1】:

    不,您应该使用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
         }
      })
    })
    

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

    【讨论】:

    • 非常感谢,这似乎是一大步,现在我可以通过使用事务正确更新它,唯一的一点是该函数正在打印“错误序列化返回值:TypeError:转换循环结构到 JSON”在控制台中。我不知道为什么,因为“投票”应该始终是一个浮点值。
    • @AlejandroMorán 男孩,如果你能解决这个错误,你就是我的英雄。我在 Github 上问过:github.com/firebase/functions-samples/issues/193 并且有一个解决方法……我认为这是 Firebase 中的一个错误,应该很快修复。
    • 是的,根据这个答案,这似乎是一个 Firebase 错误:github.com/firebase/functions-samples/issues/… 返回值是一个 TransactionResult 并且不能被序列化,有一个解决方法。
    • 我已经尝试了解决方法并且它有效,再次非常感谢您的帮助。
    猜你喜欢
    • 2017-08-26
    • 2017-11-10
    • 2017-09-09
    • 2020-05-31
    • 2017-09-01
    • 2017-10-27
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多