在Firebase函数中使用实时数据库的onWrite触发器

在Firebase函数中使用实时数据库的onWrite触发器,firebase,flutter,firebase-realtime-database,dart,google-cloud-functions,Firebase,Flutter,Firebase Realtime Database,Dart,Google Cloud Functions,我使用dart和firebase后端设计了一个颤振应用程序。我想在用户创建、删除、更新数据库中的任何内容时触发。我理解了创建、删除、更新方法。 我在firebase云函数中编写了一个javascript代码。我需要在触发时发送通知。我不想使用3种不同的触发器。我只想使用onWrite触发器 这是我的数据库 有四个部门,分别是:公司、民事、选举、机械。我想在单个onWrite触发器中发生数据库更改时触发 我的第一个问题是,我想区分它是创建的,还是从onWrite触发器中删除或更新的。我知道它会触

我使用dart和firebase后端设计了一个颤振应用程序。我想在用户创建、删除、更新数据库中的任何内容时触发。我理解了创建、删除、更新方法。 我在firebase云函数中编写了一个javascript代码。我需要在触发时发送通知。我不想使用3种不同的触发器。我只想使用onWrite触发器

这是我的数据库

有四个部门,分别是:公司、民事、选举、机械。我想在单个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触发器代码?

您可以检查
evt.after.data().property
为null或不存在,表示已删除

编辑:

创建内容(文档或字段)时的场景:

创建字段意味着“before”中的字段根本不存在,“after”中的字段存在,但可以为null

当您更新某些内容时的场景


“之前”中的字段与“之后”中的字段不同

您可以使用
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);
  ...
})

你能写一个例子吗?如何识别、创建和更新?这个答案既酷又有用。但你说过在它的路径中包含另一个参数。但我不明白。context.params.dept的返回值是什么?这是触发函数的数据库路径的值
functions.database.ref('main/notices/{dept}/{id}')
。抱歉。我尝试了上述方法。但我总是在改变后,改变前,改变后,改变前都是真的吗?你知道为什么吗?