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

时间:2017-10-09 20:25:56

标签: javascript firebase firebase-realtime-database google-cloud-functions

我有一个使用firebase的应用程序,整个堆栈,功能,数据库,存储,身份验证,消息传递,整个9.我希望保持客户端非常轻量级。因此,如果用户对帖子和"标签进行评论"另一个用户,让我们说使用典型的" @ username"样式标记,我把所有繁重的工作移动到了firebase功能。这样,客户端不必根据用户名找出用户ID,并执行其他所有操作。它是使用触发器设置的,所以当上面的场景发生时,我写一个"表"叫做#34; create_notifications"有一些数据,如

{
  type: "comment", 
  post_id: postID, 
  from: user.getUid(), 
  comment_id: newCommentKey, 
  to: taggedUser
}

如果taggedUser是用户名,则postID是活动帖子,newCommentKey是从注释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_notifications"表,我需要删除启动整个事件的事件。有谁知道这是怎么做到的吗?谢谢。

3 个答案:

答案 0 :(得分:3)

首先,请使用.onCreate代替.onWrite。您只需在第一次写入时阅读每个孩子,这样可以避免不良副作用。有关可用触发器的详细信息,请参阅文档here

event.data.ref()保存事件发生的参考。您可以在引用上调用remove()来删除它:

return event.data.ref().remove()

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对于较新版本的Firebase,请使用: return change.after.ref.remove()