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

Firebase database triggers: onCreate, onUpdate, onDelete

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

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

当然值得!拆分你的功能会让你的功能更短、更清晰、更快。此外,您还将避免无限调用 DatabaseTriggers 以最终应用 return。最后你会为你的应用程序使用的触发器数量付费,所以你应该尽量避免无用的调用来省钱!

要首先在您的云函数中实现它,您需要在函数 folder 内更新 package.json 上的 firebase-functions 版本,并将其升级到 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;
        });
});

您可以在下一个 post 中查看更多示例并阅读有关此新功能的信息:https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html