首页 > 解决方案 > 如何捕获输入的元素。云函数。火力基地

问题描述

我需要捕获输入到某个数据库中的元素,我该怎么做?我试过了,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()andsnap.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:对不起,如果我的英语不够好,我会使用翻译器:(

标签: node.jsfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


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);


推荐阅读