在 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.beforechange.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 / vue.js 实时删除功能

Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native

使用JavaScript在旧图像上发布Firebase实时数据库

如何在单个 iOS 项目/应用程序中为发布和调试模式(测试和生产环境)制作不同的 Firebase 数据库?