【问题标题】:How to know new data in Firebase cloud functions?如何知道 Firebase 云函数中的新数据?
【发布时间】:2017-05-18 12:11:49
【问题描述】:

您如何知道数据是否未发生变化以及 Firebase Cloud 功能中有哪些新功能?我尝试了几种不同的选项来标记如果数据刚刚更改,那么我不会发送推送通知。我也尝试从快照 _newData 和 _data 子节点的个数进行比较,如果 __newData 更大,那么这是一条新记录,但是没有用。请告诉我如何做到这一点。

示例代码的 sn-p。

   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')
    }

【问题讨论】:

    标签: node.js firebase google-cloud-functions


    【解决方案1】:

    您需要使用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');
            }
         });
    

    【讨论】:

    • 请告诉我,您可以使用两个动态键,例如 functions.database.ref('/userListEvents/{userID}/{requestID}') ?
    • @Alexsander:是的,允许多个键。
    【解决方案2】:

    查看以下示例:

    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
      }
    });
    

    【讨论】:

    • 请查看更新:此选项对我不起作用,因为如果我执行例如 functions.database.ref ('/userListEvents / {userID} / {eventID}'),则会出现错误报告该字段不能为空。
    【解决方案3】:

    除了已在此处发布的内容之外,您还有一个选择是使用changed() 方法作为标志来指示给定引用是否已更改。示例:

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

    虽然它没有告诉您 什么 发生了变化,但它是一种了解给定节点下 something 是否发生变化的简单方法。有another example in the docs

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 2018-04-14
      • 2018-08-06
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多