火力地堡:检查“写入或删除”的onWrite活动

问题描述 投票:7回答:5

我有以下函数,用于侦听数据库触发器像这样的onWrite事件:

exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
        .onWrite(event => {

            ...
         });

无论上述功能被称为节点是否被删除或添加。如何检查onWrite事件是特定节点的“删除”事件或“添加”事件,例如,当它是一个“添加”事件这个功能只被调用。

javascript firebase google-cloud-functions
5个回答
8
投票

传递到函数的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;
  }

2
投票

如果你改变云公司的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;
  }

2
投票

阅读下面的文章,添加事件元素的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()的保证事件元素实际上有可以使用的数据。


1
投票

一个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');
}

0
投票

我反而使用具有略微不同的语法,但完成你正在尝试做.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.
         });

0
投票

如果你想只触发此功能可为add事件时,onCreate()触发将要走的路。

但是,您也可以检测它是否使用onWrite()对象的beforeafter性质的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

© www.soinside.com 2019 - 2024. All rights reserved.