仅在关键存在Firebase云功能的情况下更新

时间:2018-07-23 11:35:03

标签: node.js firebase firebase-realtime-database google-cloud-functions

我有一个函数,可以计算将要进行活动的所有成员。

我有registered_people键来计算此事件中有多少用户。当有人将自己添加到/ registrations / approved链接时,此密钥将更新+1或-1。

这很好。请参见下面的方法。

exports.reservation = functions.database.ref('/agenda/activitys/{year}/{month}/{day}/{time}/{event}/registrations/approved/{key}').onWrite((event) => {
        var collectionRef = event.data.adminRef.parent.parent;
        var countRef = collectionRef.parent.child('registered_people');

    console.log("Fired of reservation watcher");

    return countRef.transaction(function(current) {
        if (event.data.exists() && !event.data.previous.exists()) {
            return (current || 0) + 1;
        }
        else if (!event.data.exists() && event.data.previous.exists()) {
            return (current || 0) - 1;
        }
    });
}); 

但是我的问题是管理员删除事件时。网址/agenda/activitys/{year}/{month}/{day}/{time}/{event}被删除,上面定义的方法被触发并将数据再次写入url。如何防止管理员删除事件时此方法写入任何内容?

此代码不起作用:

if (event.data.previous.exists()) {
    return;
  }

因为当用户要从事件中注销时,必须更新registered_people。使用上面定义的代码,删除将不再起作用。因此,我需要检查事件是否已删除。

1 个答案:

答案 0 :(得分:1)

首先,您正在运行旧版本的function&admin,请进行更新以确保您的firebase-functions和firebase-admin已更新:

在您的functions文件夹中运行:

npm install firebase-functions@latest --save 
npm install firebase-admin@latest --save

然后您的代码应如下所示:

exports.reservation = functions.database.ref('/agenda/activitys/{year}/{month}/{day}/{time}/{event}/registrations/approved/{key}').onWrite((change, context) => {
  var collectionRef = change.after.ref.parent.parent;
  var countRef = collectionRef.parent.child('registered_people');
  let increment;
  if (change.after.exists() && !change.before.exists()) {
    increment = 1;
  } else if (!change.after.exists() && change.before.exists()) {
    return null;
  } else {
    return null;
  }
  return countRef.transaction((current) => {
    return (current || 0) + increment;
  }).then(() => {
    return console.log('Counter updated.');
  });
});