Firebase数据库触发器:onCreate,onUpdate,onDelete

时间:2017-07-14 10:52:37

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

在上一个Firebase功能版本中,FirebaseDatabase触发器已更新,将其功能与onCreateonUpdateonDelete分开,而不是始终使用onWrite,并检查数据是否包含每次通话中都被删除了。

有人可以提供更多信息,了解是否值得将当前FirebaseDatabase触发器迁移到新的分割功能以及如何在应用程序中更新它。

1 个答案:

答案 0 :(得分:5)

当然值得!拆分您的功能将使您的功能缩短,清晰和快速。此外,您将避免无限次调用DatabaseTriggers以最终应用return。最后,您将支付应用程序正在使用的触发器数量,因此您应该尽量避免无用的通话以节省资金!

要在云端功能中首先实现它,您需要在功能firebase-functions内的package.json更新folder版本,并至少将其升级到0.5.9

关于如何使用每个触发器,让我们更接近可以拆分的onWrite示例。

function检查新comment是否针对特定reference,并根据是否已添加deletedupdated加1,减1或什么都不做:

exports.countComments = functions.database.ref('/workoutPosts/{workoutId}/info/comments/{commentId}').onWrite(event => {
    const workoutId = event.params.workoutId;

    //Comment created
    if (event.data.exists() && !event.data.previous.exists()) {
        return database.ref(`/workoutPosts/${workoutId}/meta/commentsCount`).transaction(addPrivateWorkout => {
            return (addPrivateWorkout || 0) + 1;
        });
        //Comment deleted
    } else if (!event.data.exists() && event.data.previous.exists()) {
        return database.ref(`/workoutPosts/${workoutId}/meta/commentsCount`).transaction(deletePrivateWorkout => {
            return (deletePrivateWorkout || 0) - 1;                
        });
        //Comment updated
    } else if (event.data.exists() && event.data.previous.exists()) {
        return
    }
};

每次更新通话都是无用的通话,浪费资源。我们怎样才能让这更容易?使用新的拆分云功能:

exports.countCommentsOnCreate = functions.database.ref('/workoutPosts/{workoutId}/info/comments/{commentId}').onCreate(event => {
    const workoutId = event.params.workoutId;
        return database.ref(`/workoutPosts/${workoutId}/meta/commentsCount`).transaction(addPrivateWorkout => {
            return (addPrivateWorkout || 0) + 1;
        });       
});

exports.countCommentsonDelete = functions.database.ref('/workoutPosts/{workoutId}/info/comments/{commentId}').onDelete(event => {
    const workoutId = event.params.workoutId;

        return database.ref(`/workoutPosts/${workoutId}/meta/commentsCount`).transaction(deletePrivateWorkout => {
            return (deletePrivateWorkout || 0) - 1;
        });
});

您可以查看更多示例,并在下一篇文章中了解这些新功能:https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html