如何捕获输入的元素。 CloudFuntions。火力基地

时间:2018-09-23 13:40:33

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

我需要捕获输入特定数据库的要素,我该怎么办?我曾尝试使用snap.val(),但不适用于snap.after.val(),但是我对它的用途尚不十分了解。...

exports.getDat = functions.database.ref('/a_principal').onWrite((snap, context) => {

    // snap.data.val(); fail-
    // snap.val(); fail-

    console.log(snap.before.val());
    console.log(snap.after.val());

});

使用snap.before.val()snap.after.val()可以在事件发生之前和之后获取字符串的值,但是如何捕获插入的数据?也就是激活事件的事件,在这种情况下,事件将是snap.after.val()

中出现的最后一个事件

snap.before.val()返回: { '01': 11, '02': 22, '03': 33 }

snap.after.val()返回: { '01': 11, '02': 22, '03': 33, '04': 44 }

很明显,激活.onWrite的数据是{ '04': 44 }。那就是我要创建的数据,我该怎么做?

感谢您的帮助。

PS:对不起,如果我的英语不够好,我会使用翻译器:(

1 个答案:

答案 0 :(得分:2)

Cloud Functions为您提供了两个快照:

  1. 在触发函数的写操作之前存在的数据
  2. 触发该函数的写入操作后存在的数据

快照不包含有关已更改内容增量的明确信息。但是通过比较旧数据和新数据,您可以确定自己在代码中。这实际上是纯JavaScript操作,与Firebase或Cloud Functions不相关。

一种简单的实现方法:

var before = { '01': 11, '02': 22, '03': 33, '05': 0 };
var after =  { '01': 11, '02': 22, '03': 32, '04': 44 };

var added = {},
    removed = {},
    changed = {};
    
Object.keys(before).forEach(function(key) {
  if (!after[key]) {
    removed[key] = before[key];
  }
  else if (before[key] !== after[key]) {
    changed[key] = after[key];
  }
});
Object.keys(after).forEach(function(key) {
  if (!before[key]) added[key] = after[key];
});

console.log("added", added, "removed", removed, "changed", changed);