我有一个应用程序,它使用firebase,整个堆栈,函数,数据库,存储,身份验证,消息传递,整个9。我想保持客户端的轻量级。因此,如果一个用户在帖子上发表评论并"标记"另一个用户,比如说使用典型的"@username"风格的标记,我将所有繁重的工作都转移到了firebase功能上。这样,客户端就不必根据用户名来计算用户ID,也不必做其他事情。它是使用触发器设置的,所以当上面的场景发生时,我会写入一个名为"create_notifications"的"表",其中包含一些数据,如
{
type: "comment",
post_id: postID,
from: user.getUid(),
comment_id: newCommentKey,
to: taggedUser
}
其中taggedUser是用户名,postID是活动帖子,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
});
})
}
因此,在它的最后一个"return"函数中,在它将最终确定的数据写入"/user_notifications"表后,我需要删除启动整个事件的事件。有人知道怎么做吗?非常感谢。
首先,使用.onCreate
而不是.onWrite
。你只需要在每个孩子第一次写的时候阅读,这样可以避免不良的副作用。有关可用触发器的更多信息,请参阅此处的文档。
event.data.ref()
保存事件发生的引用。您可以调用引用上的remove()
来删除它:
return event.data.ref().remove()
实现这一点的最简单方法是调用admin-sdk提供的remove()
函数,您可以通过事件获得对notification_id
的引用,即event.params.notification_id
,然后在需要时将其与admin.database().ref('pass in the path').remove();
一起删除,这样就可以继续了。
对于较新版本的Firebase,请使用:return change.after.ref.remove()