Облачные функции Firebase JavaScript - Как получить несколько данных из разных таблиц в одной функции - PullRequest
0 голосов
/ 04 июня 2018

enter image description here

У меня есть эта структура в базе данных Firebase выше

Случай: Когда пользователь отправляет сообщение другому пользователю,Поле newMessage обновлено -true- в customer / id / chats / chatid

Затем я пытаюсь извлечь последнее сообщение из сообщений / chatid через chatid, полученное от клиентов / id / chats / chatid

Проблема: Я получаю обновление и данные о клиентах и ​​отправляю уведомления, но мне нужно это последнее сообщение, Не знаю, как это сделать Нет опыта JavaScript вообще, Пример идентификатора чата, который я получаю от клиентов _path: '/ Customers / m6QNo7w8X8PjnBzUv3EgQiTQUD12', _data: {chats: {'- LCPNG9rLzAR5OSfrclG ': [Object]} 10 * 10: [22]} 10, 1022*

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

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Действуйте следующим образом.См. Комментарии в коде и примечания в конце.

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

});

Обратите внимание, что я изменил код с

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

на

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

Последнееновый синтаксис для Cloud Functions v1. +, который был выпущен несколько недель назад.

Вам следует обновить версию своей облачной функции следующим образом:

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

См. Этот документ для получения дополнительной информации: https://firebase.google.com/docs/functions/beta-v1-diff#realtime-database

0 голосов
/ 04 июня 2018

Тот факт, что вы успешно обновляете ветку "users / uid / chats / chat", говорит о том, что у вас есть id / uid чата.Все, что вам нужно сделать, это получить «сообщения / чат» и прочитать его.Так как у вас есть идентификатор чата, подход .Promise.all работает здесь.Что-то вроде:

    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 голосов
/ 04 июня 2018

Для того, чтобы получить последнее сообщение, вам необходимо сохранить какую-то временную метку (например, используя Date.now() в Javascript) в вашей базе данных Firebase.

Затем вы получите все связанные сообщения, отсортируете их, используя функцию sort(), и используйте только самую последнюю

или

, которую вы можете использовать комбинациейтри функции запроса Firebase: equalTo , orderByChild и limitToFirst .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...