Javascript Firebase函数-向旧值添加新值

Javascript Firebase函数-向旧值添加新值,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我正在创建一个android应用程序,记录一个人花在某些事情上的时间。我想将花费的时间添加到总花费时间中,这样我就可以知道用户在某个练习类型上花费了多长时间 我想在函数中实现它,因为我认为它比事务更容易 exports.addExerciseTime = functions.database.ref('users/{userid}/stats/exerciseTime/{type}').onWrite( event =>{ console.log("Exercise tim

我正在创建一个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关闭它


但是我该怎么做呢?有更简单的方法吗?

您可以选择添加一个标志,指示您已更新数据。下次进入该函数时,只需检查中是否存在该标志,如果存在,则退出该函数。这个函数的缺点是至少要运行n+1

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


正如您所说,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事件。再次说明:您需要将其写入其他路径