Javascript Firebase:检查';写入或删除';用于onWrite事件
我有以下函数用于侦听数据库触发器的onWrite事件,如下所示:Javascript Firebase:检查';写入或删除';用于onWrite事件,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我有以下函数用于侦听数据库触发器的onWrite事件,如下所示: exports.sendNotifications = functions.database.ref('/events/{eventId}/registered') .onWrite(event => { ... }); 无论是删除还是添加节点,都会调用上述函数。如何检查onWrite事件是该特定节点的“删除”事件还是“添加”事件,以便仅当该函数是“添加”事件时才
exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
.onWrite(event => {
...
});
无论是删除还是添加节点,都会调用上述函数。如何检查onWrite事件是该特定节点的“删除”事件还是“添加”事件,以便仅当该函数是“添加”事件时才会调用该函数。传递到函数中的
事件包含触发该函数的位置的先前数据和新数据。通过这两条信息,您可以推断这是一次新的写入、更新还是删除
从:
如果您更改为Cloud 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
语句中添加对事件元素的另一个检查有一些好处:
如果从数据库读取失败(可能是网络错误??),则event.data.previous.exists()
将为false。添加event.data.exists()
可确保事件元素实际上具有您可以使用的数据。我将使用.onCreate方法,该方法的语法稍有不同,但完成了您尝试执行的操作。(请注意,onWrite和onCreate都在1.0.0的跳转中进行了修改)
试试这个:
exports.sendNotifications=functions.database.ref('/events/{eventId}/registed')
.onCreate((快照,上下文)=>{
const data=snap.val();
//^新插入数据的值
//context.params包含文档引用中使用的所有通配符字段。
});代码>创建、更新或删除文档时将触发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');
}
如果只想为add事件触发此函数,则可以使用onCreate()
触发器
但是,您也可以使用更改
对象的前属性和后属性来检测它是否是onWrite()
中的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
}
});
有关详细信息,请参阅文档:
我在我的代码库中经常这样做,因此我编写了一个您可能会用到的助手:)
从“firebase函数”导入{Change,firestore};
从“lodash”导入{isNil};
导出枚举FirestoreWriteEventType{
删除,
创造,,
更新,
不为人知
}
/**
*返回onWrite是什么类型的操作。
*@param-change
*/
const onWriteHelper=(更改:更改):FirestoreWriteEventType=>{
const oldData=change.before.data();
const newData=change.after.data();
if(isNil(newData)){
返回FirestoreWriteEventType.Delete;
}
如果(旧数据和新数据){
返回FirestoreWriteEventType.Update;
}
如果(!oldData&&newData){
返回FirestoreWriteEventType.Create;
}
返回FirestoreWriteEventType.Unknown;
};
导出默认的onWriteHelper;
自从这里给出了大多数答案之后,API似乎已经发生了变化。发布目前(2021年5月)对我有效的版本
无论是或在这两种情况下,onWrite
钩子都接受一个对象,它只是一个包含两个文档的对象:在之前和之后
可以使用exists
(这是属性,不是函数)检测创建或删除
另外,如果您只需要处理创建,那么最好使用事件处理程序。它只获取已创建文档的快照,而不是change
对象
//或者
exports.sendNotifications=functions.database.ref('/events/{eventId}/registed')
.onWrite((更改、上下文)=>{
//更改包含前后文档快照
常量{before,after}=change;
//每个快照都知道它是否存在。
如果(!before.存在){
const newEvent=after.data();
console.log('Event was created',newEvent);
返回;
}
如果(!after.存在){
const oldEvent=before.data();
console.log('Event was deleted',oldEvent);
返回;
}
log('Event changed',{from:before.data(),to:after.data()});
});
//或
exports.sendNotifications=functions.database.ref('/events/{eventId}/registed')
.onCreate((快照、上下文)=>{
const newEvent=snapshot.data();
console.log('Event was created',newEvent);
});
如果不执行任何操作,请确保从firebase函数返回nullwork@Frankvan Puffelen不为我工作,收到一个错误,说无法读取未定义的前一个属性
如何消除它?@KPal自2017年以来,API似乎发生了很大变化。我的回答如下:注意存在
不是一个函数。看我的答案:这里的逻辑也是错误的<代码>更改.before.exists
可能同时表示更新或删除。非常感谢您发布此更新信息。工作完美。
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');
}
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
}
});