【问题标题】:Firebase functions - adding new value to the oldvalueFirebase 函数 - 向旧值添加新值
【发布时间】:2017-08-02 12:05:33
【问题描述】:

我正在创建一个 android 应用程序,用于记录一个人在某些事情上花费了多长时间。我想将花费的时间添加到总花费的时间,所以我知道用户在锻炼类型上花费了多长时间 我想在一个函数中做,因为我认为它比事务更容易。

exports.addExerciseTime = functions.database.ref('users/{userid}/stats/exerciseTime/{type}').onWrite( event =>{
        console.log("Exercise time updates...");
        var newdata = event.data.val();
        var oldData = event.data.previous.val();
        return event.data.ref.update(oldData+ newdata);
    });

现在,我知道这个函数会一直循环,直到 firebase 将其关闭。

但是我该怎么做呢?有没有更简单的方法来做到这一点?

【问题讨论】:

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


    【解决方案1】:

    您可以轻松地添加一个标志,表明您已更新数据。下次您将进入该函数时,只需检查标志是否存在,如果存在,则退出该函数。这个的缺点是你将至少运行 n+1 个函数

    另一个选项,根据他们的最新帖子,您知道还有一个“onUpdate”和“onCreate”触发器。您也许可以巧妙地使用它们来进一步优化它(例如:仅在第一次创建时执行 XYZ,因此它不会在每次更新时运行)。

    https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html

    【讨论】:

      【解决方案2】:

      正如您所说,onWrite 将捕获每个写入事件。我的解决方案是将 onWrite 替换为 onCreate,但是让用户写入另一个路径,因为 Firebase 将继续触发该功能。除此之外,您的方法不是最好的解决方案,因为更新可能会发生冲突。使用事务更好。看起来像这样:

      exports.addExerciseTime = functions.database.ref('users/{userid}/stats/exerciseTime/{type}').onCreate( event =>{
              console.log("Exercise time updates...");
              var newdata = event.data.val();
              const pathToValue = //create the path here to exercisetime
              return pathToValue.transaction(function(exercisetime) {
              return (exercisetime || 0) + newdata;
             });
          });
      

      *注意 onCreate 事件而不是 onWrite。再说一遍:您需要将其写入其他路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-24
        • 1970-01-01
        • 2020-08-07
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 2020-11-14
        相关资源
        最近更新 更多