Firebase功能从Firebase DB获取数据以进行推送通知

我与Firebase数据库和Firebase云消息传递聊天应用程序。 我可以通过控制台发送Firebase通知,但在实际情况下,它应该是自动的。 为了进行自动通知,我的朋友为我写了Index.js(在云功能中添加)文件,但它没有发送通知。

根据我们的逻辑函数,应该触发任何新条目(在任何节点或任何房间中),并通过firebase函数获取这些值,并向FCM服务器发出通知接收方设备的请求(从token_To获取接收方设备的值)。

  • 信息
  • Message_From
  • 时间
  • 类型
  • token_To
  • Firebase数据库结构

    Index.js

    var functions = require('firebase-functions');
    var admin = require('firebase-admin');
    
    
    var serviceAccount = require('./demofcm-78aad-firebase-adminsdk-4v1ot-2764e7b580.json');
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      databaseURL: "https://demofcm-78aad.firebaseio.com/"
    })
    
    // // Create and Deploy Your First Cloud Functions
    // // https://firebase.google.com/docs/functions/write-firebase-functions
    //
    // exports.helloWorld = functions.https.onRequest((request, response) => {
    //  response.send("Hello from Firebase!");
    // });
    exports.setUserNode = functions.auth.user().onCreate(event => {
      // ...
    });
    
    exports.notifyMsg = functions.database.ref('/{chatroom}/{mid}/')
        .onWrite(event => {
    
           if (!event.data.val()) {
             return console.log('Message Deleted');
           }
    
           const getDeviceTokensPromise = admin.database().ref('/{chatroom}/{mid}/token_to').once('value');
    
    
           return Promise.all([getDeviceTokensPromise]).then(results => {
             const tokensSnapshot = results[0];
    
             if (!tokensSnapshot.hasChildren()) {
               return console.log('There are no notification tokens to send to.');
             }
    
             const payload = {
               notification: {
                 title: 'You have a new Message!',
                 body: event.data.val().Message
               }
             };
    
             const tokens = Object.keys(tokensSnapshot.val());
    
             return admin.messaging().sendToDevice(tokens, payload).then(response => {
    
               const tokensToRemove = [];
               response.results.forEach((result, index) => {
                 const error = result.error;
                 if (error) {
                   console.error('Failure sending notification to', tokens[index], error);
    
                   if (error.code === 'messaging/invalid-registration-token' ||
                       error.code === 'messaging/registration-token-not-registered') {
                     tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
                   }
                 }
               });
               return Promise.all(tokensToRemove);
             });
           });
    });
    

    Firebase功能日志

    Firebase云功能日志

    我怎样才能从数据库中获取同一房间内的任何新增节点(9810012321-9810012347)或任何其他房间(9810012321-9810012325)的上述值并将其发送给FCM以进行通知

    提前致谢。


    我做的是创建一个消息节点,我相信这是由用户键来完成的。 即让接收者(toId)和发件人(fromId)密钥发送通知。 希望能帮助到你。

    Firebase消息节点

    exports.sendMessageNotification = functions.database.ref('/messages/{pushId}')
    .onWrite(event => {
        let message = event.data.current.val();
        console.log('Fetched message', event.data.current.val());
        let senderUid = message.fromId;
        let receiverUid = message.toId;
        let promises = [];
    
        console.log('message fromId', receiverUid);
        console.log('catch me', admin.database().ref(`/users/${receiverUid}`).once('value'));
    
        if (senderUid == receiverUid) {
            //if sender is receiver, don't send notification
            //promises.push(event.data.current.ref.remove());
            return Promise.all(promises);
        }
    
        let messageStats = message.messageStatus;
        console.log('message Status', messageStats);
    
        if (messageStats == "read") {
            return Promise.all(promises);
        }
    
        let getInstanceIdPromise = admin.database().ref(`/users/${receiverUid}/pushToken`).once('value');
        let getSenderUidPromise = admin.auth().getUser(senderUid);
    
        return Promise.all([getInstanceIdPromise, getSenderUidPromise]).then(results => {
            let instanceId = results[0].val();
            let sender = results[1];
            console.log('notifying ' + receiverUid + ' about ' + message.text + ' from ' + senderUid);
            console.log('Sender ', sender);
            var badgeCount = 1;
            let payload = {
                notification: {
                    uid: sender.uid,
                    title: 'New message from' + ' ' + sender.displayName,
                    body: message.text,
                    sound: 'default',
                    badge: badgeCount.toString()
                },
                'data': { 
                    'notificationType': "messaging", 
                    'uid': sender.uid
              }
            };
            badgeCount++;
            admin.messaging().sendToDevice(instanceId, payload)
                .then(function (response) {
                    console.log("Successfully sent message:", response);
                })
                .catch(function (error) {
                    console.log("Error sending message:", error);
                });
        });
    });
    

    const getDeviceTokensPromise = event.data.child('token_To');
    

    应该在那里从数据库引用中获取数据。

    要么

    固定路径没有通配符,如下所示

    const getDeviceTokensPromise = admin.database().ref('/${chatroom}/${mid}/token_to').once('value');
    

    chatroom和mid是包含价值的变量

    第二件事:

    if (!tokensSnapshot.exists()) { 
    

    应该取而代之

    if (!tokensSnapshot.hasChildren()) {
    

    第三件事:

    我不确定推送通知tokenId,但它需要做什么?

    const tokens = Object.keys(tokensSnapshot.val());

    可能是我们可以直接使用像下面一样发送推送通知

    const tokens = tokensSnapshot.val();


     let payload = {
            notification: {
                uid: sender.uid,
                title: 'New message from' + ' ' + sender.displayName,
                body: message.text,
                sound: 'default',
                badge: badgeCount.toString()
            },
            'data': { 
                'notificationType': "messaging", 
                'uid': sender.uid
          }
        };
    

    有两种类型的FCM。 1)数据2)通知

    有关详细概述:FCM参考

    您必须修复两个FCMS的有效载荷。 而对于数据FCM,您必须提取FCM服务(客户端)中的数据并根据您的需要生成推送通知。

    链接地址: http://www.djcxy.com/p/40975.html

    上一篇: Firebase function to fetch data from Firebase DB to make Push notification

    下一篇: cv2.aruco.detectMarkers doesn't detect markers in python