Firebase:检查onWrite事件的"写入或删除"

Koh*_*Koh 10 javascript firebase google-cloud-functions

我有以下函数来监听数据库触发器的onWrite事件,如下所示:

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

            ...
         });
Run Code Online (Sandbox Code Playgroud)

无论是删除还是添加节点,都会调用上述函数.如何检查onWrite事件是否为该特定节点的"删除"事件或"添加"事件,以便仅在"添加"事件时才调用此函数.

小智 13

如果您只想为添加事件触发此函数,则onCreate()触发器将是可行的方法。

但是,您还可以onWrite()使用对象的beforeafter属性来检测它是否是添加事件Change

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
    }

  });
Run Code Online (Sandbox Code Playgroud)

在文档中查找更多详细信息:

https://firebase.google.com/docs/functions/database-events#handle_event_data

  • 这里的逻辑也是错误的。`change.before.exists` 可能意味着两者:更新或删除。 (7认同)
  • 注意“exists”不是一个函数。查看我的答案:/sf/answers/4709541231/ (3认同)

Dav*_*dad 9

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');
}
Run Code Online (Sandbox Code Playgroud)


Fra*_*len 8

event传递到函数既包含以前的数据和触发功能的位置的新数据.通过这两条信息,您可以推断出它是新写入,更新还是删除.

Firebase文档中获取数据库函数:

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;
  }
Run Code Online (Sandbox Code Playgroud)


kub*_*b1x 7

自从这里的大多数答案以来,API 似乎已经发生了变化。发布当前(2021 年 5 月)对我有用的版本。

无论是Firestore还是实时数据库,在这两种情况下,onWrite钩子都接受change对象,该对象只是一个包含两个文档快照的对象:beforeafter

可以使用exists(这是getter属性,而不是函数)来检测创建或删除。

另外,如果您需要处理的只是创建,那么最好使用onCreate事件处理程序。它仅获取创建文档的快照来代替对象change

// EITHER
exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
  .onWrite((change, context) => {
    // Change contains before and after documents snapshots
    const { before, after } = change;

    // Each snapshot knows if it exists. 
    if (!before.exists) {
      const newEvent = after.data();
      console.log('Event was created', newEvent);
      return;
    }

    if (!after.exists) {
      const oldEvent = before.data();
      console.log('Event was deleted', oldEvent);
      return;
    }

    console.log('Event changed', { from: before.data(), to: after.data() });

  });

// OR
exports.sendNotifications = functions.database.ref('/events/{eventId}/registered')
  .onCreate((snapshot, context) => {
    const newEvent = snapshot.data();
    console.log('Event was created', newEvent); 
  });
Run Code Online (Sandbox Code Playgroud)