【问题标题】:delete incoming write event after calculations in firebase functions在 Firebase 函数中计算后删除传入的写入事件
【发布时间】:2017-10-09 20:25:56
【问题描述】:

我有一个使用 firebase 的应用程序,几乎整个堆栈、函数、数据库、存储、身份验证、消息传递,整个 9。我想让客户端保持非常轻量级。因此,如果一个用户在帖子上“标记”另一个用户,比方说使用典型的“@username”样式标记,我将所有繁重的工作转移到了 firebase 函数。这样,客户端就不必根据用户名找出用户 ID,并执行其他所有操作。它是使用触发器设置的,所以当发生上述情况时,我会写入一个名为“create_notifications”的“表”,其中包含一些数据,例如

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

taggedUser 是用户名,postID 是活动帖子,newCommentKey 是从 cmets 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”表之后,我需要删除启动整个事情的事件。有谁知道这是怎么做到的吗?谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我将其更改为 onCreate,我是否仍会使用相同的路径并仍然拥有 {notification_id} 参数?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-11-19
        • 2019-12-18
        • 2020-07-23
        • 1970-01-01
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多