2017-05-18 51 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

相關問題