javascript - 在 Firebase 函数中计算后删除传入的写入事件

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

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

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

其中 taggedUser 是用户名,postID 是事件帖子,newCommentKey 是从评论数据库引用上的 .push() 检索的,而 user.getUid() 来自 firebase 身份验证类。

现在,在我的 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”表后,我需要删除启动整个事件的事件。有谁知道这是怎么做到的吗?谢谢。

最佳答案

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

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

返回 event.data.ref().remove()

关于javascript - 在 Firebase 函数中计算后删除传入的写入事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46654437/

相关文章:

json - 将 Firebase Datasnapshot 转换为可编码的 JSON 数据

javascript - Jquery获取div的内容

javascript - 如何在每次单击按钮时在 javascript 中附加新元素

javascript - 无法使用 Three.js 更改 Material 颜色

javascript - Firebase - 使用回调在数组中检索和存储数据

java - 从 Firebase 实时数据库检索数据到 ListView

javascript - 计算 Firebase Cloud Functions 中的子级数

javascript - 三.js:全局旋转

javascript - Web SDK child_changed 可以返回 promise 吗?

JavaScript JQuery 为什么按钮的 ID 没有被正确引用