Javascript 在firebase函数中计算后删除传入写入事件

Javascript 在firebase函数中计算后删除传入写入事件,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个应用程序,使用firebase,整个堆栈,功能,数据库,存储,身份验证,消息,整个9。我想保持客户端非常轻量级。因此,如果一个用户在帖子上发表评论并“标记”另一个用户,比如说使用典型的“@username”样式标记,我将所有繁重的工作都转移到了firebase功能上。这样,客户端就不必根据用户名计算出用户ID,也不必做其他任何事情。它是使用触发器设置的,所以当上述场景发生时,我会使用一些数据写入一个名为“create_notifications”的“表”,如 { type: "com

我有一个应用程序,使用firebase,整个堆栈,功能,数据库,存储,身份验证,消息,整个9。我想保持客户端非常轻量级。因此,如果一个用户在帖子上发表评论并“标记”另一个用户,比如说使用典型的“@username”样式标记,我将所有繁重的工作都转移到了firebase功能上。这样,客户端就不必根据用户名计算出用户ID,也不必做其他任何事情。它是使用触发器设置的,所以当上述场景发生时,我会使用一些数据写入一个名为“create_notifications”的“表”,如

{
  type: "comment", 
  post_id: postID, 
  from: user.getUid(), 
  comment_id: newCommentKey, 
  to: taggedUser
}
其中taggedUser是用户名,postID是活动post,newCommentKey是从comments db引用的.push()检索的,user.getUid()是从firebase auth类检索的

现在,在我的firebase函数中,我有一个特定表的“onWrite”触发器,该触发器获取所有相关信息,并向帖子的海报发送通知以及所有相关细节。所有这些都已经完成了,我想弄明白的是。。。如何删除传入事件,这样就不需要任何cron作业来清除此表。我可以抓取事件,进行所需的计算和数据收集,发送消息,然后删除传入的事件,这样它就不会真正存在于数据库中,除非收集数据所需的时间很短

firebase函数触发器的简化示例如下

exports.createNotification = functions.database.ref("/create_notifications/{notification_id}").onWrite(event => {
  const from = event.data.val().from;
  const toName = event.data.val().to;
  const notificationType = event.data.val().type;
  const post_id = event.data.val().post_id;
  var comment_id, commentReference;
  if(notificationType == "comment") {
    comment_id = event.data.val().comment_id;
  }

  const toUser = admin.database().ref(`users`).orderByChild("username").equalTo(toName).once('value');
  const fromUser = admin.database().ref(`/users/${from}`).once('value');
  const referencePost = admin.database().ref(`posts/${post_id}`).once('value');

  return Promise.all([toUser, fromUser, referencePost]).then(results => {
    const toUserRef = results[0];
    const fromUserRef = results[1];
    const postRef = results[2];

    var newNotification = {
      type: notificationType,
      post_id: post_id,
      from: from,
      sent: false,
      create_on: Date.now()
    }
    if(notificationType == "comment") {
      newNotification.comment_id = comment_id;
    }

    return admin.database().ref(`/user_notifications/${toUserRef.key}`).push().set(newNotification).then(() => {
      //NEED TO DELETE THE INCOMING "event" HERE TO KEEP DB CLEAN
    });
  })
}

因此,在该函数的最终“返回”中,在它将最终数据写入“/user\u notifications”表之后,我需要删除启动整个事件的事件。有人知道怎么做吗?谢谢。

实现这一点的最简单方法是调用AdminSDK提供的
remove()
函数,
您可以通过事件获取对
通知_id
的引用,即
event.params.notification_id
然后在需要时使用
admin.database().ref('pass in the path').remove()将其删除就可以了。

实现这一点的最简单方法是调用AdminSDK提供的
remove()
函数,
您可以通过事件获取对
通知_id
的引用,即
event.params.notification_id
然后在需要时使用
admin.database().ref('pass in the path').remove()将其删除
你就可以开始了。

首先,使用
.onCreate
而不是
.onWrite
。你只需要在每个孩子第一次写的时候读,这样可以避免不必要的副作用。有关可用触发器的更多信息,请参阅文档

event.data.ref()
保存事件发生的引用。您可以对引用调用
remove()
,将其删除:


返回事件.data.ref().remove()。你只需要在每个孩子第一次写的时候读,这样可以避免不必要的副作用。有关可用触发器的更多信息,请参阅文档

event.data.ref()
保存事件发生的引用。您可以对引用调用
remove()
,将其删除:


返回事件.data.ref().remove()
对于较新版本的Firebase,请使用:
返回更改。在.ref.remove()之后
对于较新版本的Firebase,请使用:
返回change.after.ref.remove()

如果我将其更改为onCreate,我是否仍然使用相同的路径并仍然具有{notification\u id}参数?如果我将其更改为onCreate,我是否仍然使用相同的路径并仍然具有{notification\u id}参数?