2017-05-18 49 views
1

您如何知道数据是否未更改以及Firebase Cloud功能中的新增功能?我已经尝试了几种不同的选项来标记,如果数据刚刚更改,那么我不会发送推送通知。另外我试图从快照中获得_newData 和_data子节点比较的数量,如果__newData更大,那么这是一个新的记录,但它不起作用。请告诉我怎么做。如何了解Firebase云端功能中的新数据?

示例代码片段。

module.exports = functions.database.ref('/userListEvents/{userID}') 
     .onWrite(event => { 

      const snapshot = event.data; 

      if (event.data.val() && !event.data.previous.val()) { 
       console.log('send push notification'); 
      } else if (snapshot._data) { 
       console.log('send push notification'); 
      } else { 
       return console.log('data was removed'); 
      }; 
    } 

参考

functions.database.ref('/cards/{cardID}/interestedUsers') 
    .onWrite(event => { 

更新:此选项不为我工作,因为如果我这样做如functions.database.ref ('/ userListEvents/{userID}/{eventID}'),则错误报道,该字段不能为空。

我试过了,但没有得到好的结果。

if (event.data.val() && !event.data.previous.val()) { 
     console.log('send push notification'); 
    } else if (event.data.val() && event.data.previous.val()) { 
     const newData = event.data.val(); 
     const previousData = event.data.previous.val(); 
     console.log('newData', newData, 'previousData', previousData); 
     const newDataKeys = Object.keys(newData); 
     const previousDataKeys = Object.keys(previousData); 

     if (newDataKeys.length > previousDataKeys.length) { 
      console.log('send push', newDataKeys.length, previousDataKeys.length); 
     } else { 
      return console.log('just update data', newDataKeys.length, previousDataKeys.length); 
     } 
    } else { 
     return console.log('removed data') 
    } 

回答

3

你需要使用event.data.current.val()event.data.val()比较。例如:

exports.detectChange = functions.database.ref('/userListEvents/{userID}') 
    .onWrite(event => { 
     const crnt = event.data.current; 
     const prev = event.data.previous; 

     if (crnt.val() && !prev.val()) { 
      // value created 
      console.log('Created: send push notification'); 
     } else if (!crnt.val() && prev.val()) { 
      // value removed 
      console.log('Removed: send push notification'); 
     } else { 
      // value updated 
      console.log('Updated'); 
     } 
    }); 
+0

请告诉我,你可以使用两个动态键例如functions.database.ref('/ userListEvents/{userID}/{requestID}')? – Alexander

+0

@Alexsander:是的,允许多个键。 –

1

检查下面的例子:

exports.Observedata = functions.database.ref("/location/{id}").onWrite((event) => { 
    const id = event.params.id; 
    const snap = event.data; 
    if (!snap.exists() && snap.previous.exists()) { 
    //deleted data 
    } else if (snap.exists() && !snap.previous.exists()) { 
    //newly addded data 
    } else if (!snap.child("isactive").val() && snap.child("isactive").changed()) { 
    //if the node isactive changed its value from false to true 
    } 
}); 
+0

请看看更新:这个选项对我不起作用,因为如果我这样做,例如functions.database.ref('/ userListEvents/{userID}/{eventID}'),那么报告错误是该字段必须不是空的。 – Alexander

0

你有另一种选择,比已公布在这里等,是使用changed()方法作为一个标志,指示,如果给定的参考已经改变与否。例如:

exports sampleFunction = functions.database.ref('/userListEvents/${userId}') 
    .onWrite(event => { 
    var eventSnapshot = event.data; 
    if (eventSnapshot.changed()) { 
     // Here you know something has changed 
    } 
    }); 

虽然不会告诉你什么改变了它是一个简单的方法来知道东西已给定的节点下改变。有another example in the docs

相关问题