enter image description here

Mam tę strukturę w FireBase DB powyżej

Case: Gdy użytkownik wysyła wiadomość do innego użytkownika, pole NewMessage jest zaktualizowane - w klientach / ID / czaty / Chatid

Więc co próbuję zrobić, jest pobieranie ostatniej wiadomości od wiadomości / chatid za pośrednictwem chatidem Dostaję od klientów / ID / Czat / Chatid

Problem: Dostaję aktualizację i dane na klientach i wysyłanie powiadomienia, ale potrzebuję tej ostatniej wiadomości, nie wiem, jak to zrobić W ogóle nie ma doświadczenia javascript. Przykładowy identyfikator czatu, który dostaję klientów _path: '/ klienci / m6qno7w8x8pjnbzuv3egqitqud12', _dane: {Czat: {'- LCPNGNG9RZAR5OSFRCLG ': [Object]},

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


exports.sendNotif = functions.database.ref('/customers/{id}/chats/{id}/').onUpdate((event) => {
    
    const user = event.data.val();
    console.log('Event data: ', event.data);
  
    //HERE I WANT TO USE THAT CHAT ID TO FETCH MESSAGE in MESSAGES.
    // Get last message and send notification.
    // This works when newMessage field is updated.
    // However I neeed the message content from another table.
    
  
    var myoptions = {
      priority: "high",
      timeToLive: 60 * 60 * 24
    };
    
    // Notification data which supposed to be filled via last message. 
    const notifData = {
        "notification":
        {
          "body" : "Great Match!",
          "title" : "Portugal vs. Denmark",
          "sound": "default"
        } 
    }
    

  admin.messaging().sendToDevice(user.fcm.token, notifData, myoptions)
  .then(function(response) {
    console.log('Successfully sent message:', response);
  })
  .catch(function(error) {
    console.log('Error sending message:', error);
  });
  
    return ""
});
0
selcuk 4 czerwiec 2018, 18:58

3 odpowiedzi

Najlepsza odpowiedź

Robić w następujący sposób. Zobacz komentarze w kodzie i uwagi na końcu.

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

exports.sendNotif = functions.database.ref('/customers/{id}/chats/{chatId}').onUpdate((change, context) => {

    //const afterData = change.after.val();  //I don't think you need this data (i.e. newMessage: true)
    const chatId = context.params.chatId; //the value of {chatId} in  '/customers/{id}/chats/{chatId}/' that you passed as parameter of the ref

    //You query the database at the messages/chatID location and return the promise returned by the once() method        
    return admin.database().ref('/messages/' + chatId).once('value').then(snapshot => {

        //You get here the result of the query to messagges/chatId in the DataSnapshot
        const messageContent = snapshot.val().lastMessage;


        var myoptions = {
           priority: "high",
           timeToLive: 60 * 60 * 24
        };

        // Notification data which supposed to be filled via last message. 
       const notifData = {
        "notification":
        {
          "body" : messageContent,  //I guess you want to use the message content here??
          "title" : "Portugal vs. Denmark",
          "sound": "default"
        } 
       };


       return admin.messaging().sendToDevice(user.fcm.token, notifData, myoptions);
  )
  .catch(function(error) {
        console.log('Error sending message:', error);
  });

});

Zauważ, że zmieniłem kod

exports.sendNotif = functions.database.ref('/customers/{id}/chats/{id}/').onUpdate((event) => {

Do

exports.sendNotif = functions.database.ref('/customers/{id}/chats/{chatId}/').onUpdate((change, context) => {

Ten ostatni jest nowa składnia dla funkcji chmur V1. + Które zostały wydane kilka tygodni temu.

Powinieneś zaktualizować wersję funkcji w chmurze, w następujący sposób:

npm install firebase-functions@latest --save
npm install firebase-admin@5.11.0 --save

Zobacz tę dokumentację, aby uzyskać więcej informacji: HTTPS: // Firebase. Google.com/docs/functions/beta-v1-diff#realtime-database.

1
selcuk 6 czerwiec 2018, 12:55

Fakt, że pomyślnie aktualizujesz oddział "Klienci / UID / Chats / Chat", mówi, że masz identyfikator czatu / UID. Wszystko, co robisz, jest pobierane "wiadomości / czat" i przeczytaj go. Ponieważ masz identyfikator czatu, pracuje tutaj podejście {x0}}. Coś jak:

    var promises = [writeChat(),readChat()];

    Promise.all(promises).then(function (result) {
        chat = result[1]; //result[1].val()
    }).catch(function (error) {
        console.error("Error adding document: ", error);
    });

    function readChat() {
        return new Promise(function (resolve, reject) {
          var userId = firebase.auth().currentUser.uid;
          return firebase.database().ref('/users/' + userId).once('value').then(function(snap) {
             resolve (snap)
             // ...
          }).catch(function (error) {
            reject(error);
          });
       });
    }
0
Ronnie Royston 4 czerwiec 2018, 19:20

Aby uzyskać ostatnią wiadomość, musiałbyś zapisać jakiś znacznik czasu (na przykład przy użyciu Date.now() w JavaScript w bazie danych FireBase.


Wtedy otrzymasz wszystkie powiązane wiadomości, sortuj je za pomocą {X0}} funkcja i użyj tylko najnowszego

Lub

Można użyć kombinacji trzech funkcji zapytań ogniowych: Saltto , OrderbyChild i Limittofirst.

1
user3210641 4 czerwiec 2018, 16:48