使用Cloud Functions for Firebase更改节点时发送FCM?

时间:2017-04-13 09:21:08

标签: firebase firebase-realtime-database firebase-cloud-messaging google-cloud-functions

每当Customers节点在实时数据库中更改为Orderstatus时,我都会尝试向1发送通知。

但只要Orders节点发生变化,就会发送推送通知。

我可以从快照&中验证Orderstatus的值。仅在状态为1时发送通知。但我希望在Orderstatus1时触发云功能。

如果我将路径更改为/S01/Orders/{pushId}/orderStatus。然后我无法获得customerEmail

请指导我处理这个问题的最佳方法....

enter image description here

CODE

var functions = require('firebase-functions');
var admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.shopperAlert = functions.database.ref('/S01/Orders/{pushId}')
    .onWrite(event => {

        var eventSnapshot = event.data;
        var customerEmail = eventSnapshot.child("orderedBy").val();
        console.log(customerEmail);

        const getInstanceIdPromise = admin.database().ref('S01/Customers/' + customerEmail + '/Token/').once('value');

        return Promise.all([getInstanceIdPromise]).then(results => {
            const instanceId = results[0].val();

            const payload = {
                notification: {
                    title: "Hey",
                    body: "Your Order is on the Way!"
                }
            };

            admin.messaging().sendToDevice(instanceId.FCM, payload)
                .then(function (response) {
                    console.log("Successfully sent message:", response);
                })
                .catch(function (error) {
                    console.log("Error sending message:", error);
                });

        });
    });

2 个答案:

答案 0 :(得分:1)

目前,您无法根据更改的数据过滤函数的触发器。它将在参考路径更改下的任何时间触发任何数据。如果数据以您想要的方式发生变化,则必须检查函数内部。

或者,如果您想更深入地了解“orderstatus”,您可以随时在函数内再次查询数据库,以获取您需要使用的其他数据。 event.data.ref包含触发您的函数的路径Reference,您可以使用它来导航和查询数据库以查找您正在查找的其他数据。一定要研究sample code,它与你正在做的事情有很多相似之处。

答案 1 :(得分:0)

试试这个

exports.shopperAlert = functions.database.ref('/S01/Orders/{pushId}')
    .onWrite(event => {
      const order = event.data.val();
      const status = order.orderStatus;
      if(status == 1){
           // send notification
      }else{
           // do something
     }
});