【问题标题】:Using onWrite Trigger for Realtime database in Firebase function在 Firebase 函数中为实时数据库使用 onWrite 触发器
【发布时间】: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 触发代码吗?

【问题讨论】:

    标签: firebase flutter firebase-realtime-database dart google-cloud-functions


    【解决方案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 持正确态度?你知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2017-08-25
    • 2018-10-01
    • 1970-01-01
    • 2018-10-11
    • 2021-12-27
    • 2018-08-09
    相关资源
    最近更新 更多