node.js - 如何捕获输入的元素。云函数。火力基地
问题描述
我需要捕获输入到某个数据库中的元素,我该怎么做?我试过了,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:对不起,如果我的英语不够好,我会使用翻译器:(
解决方案
Cloud Functions 为您提供了两个快照:
- 在触发函数的写入操作之前存在的数据
- 在触发函数的写操作之后存在的数据
快照不包含有关更改的增量的明确信息。但是通过比较旧数据和新数据,您可以在代码中确定自己。这实际上是一个纯 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);
推荐阅读
- javascript - 为什么内容安全策略不起作用?
- microsoft-translator - 自定义翻译器如何处理 TMX 中的内联
- javascript - 无法访问 Facebook Graph Api 响应的数据 - reactJs
- java - random.longs(ARRAY_SIZE, 0, 100000) 返回长流,我想将此流转换为长数组。怎么做?
- android - 推送通知不适用于牛轧糖和奥利奥到同一时间
- web-scraping - 使用 IMPORTHTML 将数据从 ebay 导入到谷歌电子表格
- python - 如何从交互式 shell 中提取命令输出?
- css - 在 Shadow DOM 中,覆盖 CSS body *
- node.js - redis 客户端可以在没有安装 redis 数据存储的情况下工作吗?
- haskell - 持久 - 如何过滤记录列的字段