我有以下函数,用于侦听数据库触发器像这样的onWrite事件:
exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
.onWrite(event => {
...
});
无论上述功能被称为节点是否被删除或添加。如何检查onWrite事件是特定节点的“删除”事件或“添加”事件,例如,当它是一个“添加”事件这个功能只被调用。
传递到函数的event
既包含了以前的数据和触发功能的位置的新数据。有了这两条信息,可以扣除它是否是一个新的写入,更新或删除。
从Firebase documentation for database functions:
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original') .onWrite(event => { // Only edit data when it is first created. if (event.data.previous.exists()) { return; } // Exit when the data is deleted. if (!event.data.exists()) { return; }
如果你改变云公司的FireStore那么这将是:
// Only edit data when it is first created.
if (event.data.previous.exists) {
return;
}
// Exit when the data is deleted.
if (!event.data.exists) {
return;
}
阅读下面的文章,添加事件元素的if-then
声明另一个检查后有一定的好处:https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html
exports.sendNotification = functions.database
.ref("/messages/{messageId}").onWrite(event => {
if (event.data.exists() && !event.data.previous.exists()) {
// This is a new message, not a change or a delete.
// Put code here
}
})
如果从数据库中读取失败(可能是网络错误???),然后将event.data.previous.exists()
是假的。加入event.data.exists()
的保证事件元素实际上有可以使用的数据。
一个onWrite将触发时创建的文档,更新或删除。以下是如何检查,为每一个公司的FireStore云功能的条件。
if(event.after.data == undefined){
// Deleted: data before but no data after
console.log('Deleted');
}
if(event.before.data && event.after.data){
// Updated: data before and data after
console.log('Update');
}
if(!event.before.data && event.after.data){
// Created: no data before but data after
console.log('Created');
}
我反而使用具有略微不同的语法,但完成你正在尝试做.onCreate方法。 (请注意,onWrite和的onCreate都被在跳改性从<= v0.9.1至> 1.0.0)。
尝试这个:
exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
.onCreate((snap, context) => {
const data = snap.val();
// ^ the value of the newly inserted data
// context.params contains all of the wildcard fields used in the document reference.
});
如果你想只触发此功能可为add事件时,onCreate()
触发将要走的路。
但是,您也可以检测它是否使用onWrite()
对象的before
和after
性质的Change
内add事件:
exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
.onWrite((change, context) => {
if (change.before.exists()) {
//update event
return null;
} else if (!change.after.exists()) {
//delete event
return null;
} else {
//add event
//do stuff
}
});
查找文档中的详细信息:
https://firebase.google.com/docs/functions/database-events#handle_event_data