Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase:检查';写入或删除';用于onWrite事件_Javascript_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript Firebase:检查';写入或删除';用于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事件是该特定节点的“删除”事件还是“添加”事件,以便仅当该函数是“添加”事件时才

我有以下函数用于侦听数据库触发器的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
    }

  });