Firebase 数据库触发器:onCreate、onUpdate、onDelete
Firebase database triggers: onCreate, onUpdate, onDelete
在上一个 Firebase 函数版本中,FirebaseDatabase 触发器已更新,将其功能拆分为 onCreate
、onUpdate
和 onDelete
,而不是始终使用 onWrite
并检查是否数据已被删除或未在每次通话中删除。
有人可以提供更多信息,说明是否值得将当前 FirebaseDatabase
触发器迁移到新的拆分功能以及如何在应用程序中更新它。
当然值得!拆分你的功能会让你的功能更短、更清晰、更快。此外,您还将避免无限调用 DatabaseTriggers
以最终应用 return
。最后你会为你的应用程序使用的触发器数量付费,所以你应该尽量避免无用的调用来省钱!
要首先在您的云函数中实现它,您需要在函数 folder
内更新 package.json
上的 firebase-functions
版本,并将其升级到 0.5.9
最少。
关于每个触发器的使用方法,让我们仔细看一个可以拆分的onWrite
示例。
此 function
检查何时将新 comment
写入特定 reference
并根据是否已添加 deleted
或 updated
它加 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
在上一个 Firebase 函数版本中,FirebaseDatabase 触发器已更新,将其功能拆分为 onCreate
、onUpdate
和 onDelete
,而不是始终使用 onWrite
并检查是否数据已被删除或未在每次通话中删除。
有人可以提供更多信息,说明是否值得将当前 FirebaseDatabase
触发器迁移到新的拆分功能以及如何在应用程序中更新它。
当然值得!拆分你的功能会让你的功能更短、更清晰、更快。此外,您还将避免无限调用 DatabaseTriggers
以最终应用 return
。最后你会为你的应用程序使用的触发器数量付费,所以你应该尽量避免无用的调用来省钱!
要首先在您的云函数中实现它,您需要在函数 folder
内更新 package.json
上的 firebase-functions
版本,并将其升级到 0.5.9
最少。
关于每个触发器的使用方法,让我们仔细看一个可以拆分的onWrite
示例。
此 function
检查何时将新 comment
写入特定 reference
并根据是否已添加 deleted
或 updated
它加 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