在 Firebase 函数中为实时数据库使用 onWrite 触发器
Posted
技术标签:
【中文标题】在 Firebase 函数中为实时数据库使用 onWrite 触发器【英文标题】:Using onWrite Trigger for Realtime database in Firebase function 【发布时间】:2020-08-24 22:18:46 【问题描述】:我使用 dart 和 firebase 后端设计了一个颤振应用程序。我希望在用户创建、删除、 或更新 数据库中的任何内容时触发。我了解 onCreate、onRemoved、 和 onUpdate 方法。 我在firebase云函数中写了一段javascript代码。我需要在触发发生时发送通知。我不想使用 3 个不同的触发器。我只想使用 onWrite 触发器。
这是我的数据库。
有四个部门,分别称为comp、civil、lect、和mech。我想在单个 onWrite 触发器中发生数据库更改时触发!
我的第一个问题是,我想从 onWrite 触发器中区分它是 创建、删除还是更新。我知道它将触发所有 3 个事件。但是如何区分呢?
这是我的 onCreate 代码...
exports.noticeAddedComp = functions.database.ref('main/notices/comp/id').onCreate( async evt =>
var token = ['dxnfr3dq6_Y:APA91bHavtoP62l296qzVoBhzQJbMFA']
const payload =
notification:
title : 'Message from Cloud',
body : 'This is your body',
sound : 'default'
,
data:
message : 'Thi is new Push',
click_action : 'FLUTTER_NOTIFICATION_CLICK',
;
await admin.messaging().sendToDevice(token,payload);
);
上面的代码正在运行。但它是针对 onCreate 的。
我的第二个问题是,我需要为四个部门写四个 onWrite 触发代码吗?
【问题讨论】:
【参考方案1】:您可以检查是否
evt.after.data().property;
为 null 或不存在,表示已删除。
编辑:
创建内容(文档或字段)时的场景:
字段的创建意味着“之前”中的字段根本不存在,而“之后”中的字段存在,但可以为空。
更新内容时的场景
“之前”中的字段与“之后”中的字段不同。
【讨论】:
你能写一个例子吗?如何识别创建和更新?【参考方案2】:您可以使用change.before
和change.after
属性来确定是否在onWrite
处理程序中创建、删除或更新了节点:
exports.noticeAddedComp = functions.database.ref('main/notices/comp/id')
.onWrite( async (change, context) =>
if (!change.before.exists()) console.log("New node: "+change.after.key);
if (!change.after.exists()) console.log("Deleted node: "+change.before.key);
if (change.before.exists() && change.after.exists()) console.log("Updated node: "+change.after.key)
...
);
您可以一次将云函数附加到所有部门,方法是在其路径中包含另一个参数:
exports.noticeAddedComp = functions.database.ref('main/notices/dept/id')
.onWrite( async (change, context) =>
console.log("Triggered for department: "+context.params.dept);
...
)
【讨论】:
这个答案很酷而且很有帮助。但是您说了一些关于 include another parameter into it's path 的内容。但我不明白。 context.params.dept 的回报是什么? 这是数据库路径中的值触发了这里的函数functions.database.ref('main/notices/dept/id')
。
对不起。我试过上面的方法。但我总是对 change.after 和 change.before 持正确态度?你知道为什么吗?以上是关于在 Firebase 函数中为实时数据库使用 onWrite 触发器的主要内容,如果未能解决你的问题,请参考以下文章
禁用 on('value') 缓存 firebase 实时数据库 JS SDK [关闭]
每次firebase实时数据库数据集时,RecyclerView都会重新加载
Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native