Вызов облачной функции Firebase 'ForEach', дочерний элемент снимка - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь развернуть облачную функцию Firebase, которая отправляет текстовое сообщение соответствующему получателю за x количеством текстовых сообщений.Функция запускается в моем приложении для iOS, когда выполняется обновление ссылки на базу данных реального времени «отправить», указывающее, что пользователь нажал кнопку «отправить».

Моя структура Firebase имеет значение

  {
  "user1uid": {
    "send": false
    "messagesToSend": {
      "messageuid1": {
         "messageText": "What's for dinner?",
         "recipientNumber": "+18017378888",
      }
      "messageuid2:
         "messageText": "Who won the Cowboys game?",
         "recipientNumber": "+18017377787",
      }
   }
   "user2uid": {
    "send": false
    "messagesToSend": {
      "messageuid1": {
         "messageText": "What's for dinner?",
         "recipientNumber": "+18017378888",
      }
      "messageuid2:
         "messageText": "Who won the Cowboys game?",
         "recipientNumber": "+18017377787",
      }
   }
}

Мой код в настоящее время отправляет только одно сообщение, и я не уверен, как правильно выполнить итерацию через узел messagesToSend для каждого пользователя и отправить все сообщения в нем.

Iпытался следовать учебнику , расположенному здесь .Я рассмотрел следующие ответы переполнения стека, но не могу расшифровать или получить из них решение:

Обещание Firebase для облачной функции
Правильно ли я использую ForEach?

Мой код index.js, который отправляет одно сообщение, выглядит следующим образом:

const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const twilio = require('twilio')

const accountSid = functions.config().twilio.sid;
const authToken  = functions.config().twilio.token;

const client = new twilio(accountSid, authToken);

const twilioNumber = functions.config().twilio.number;


// Start cloud function
exports.sendSecrets = functions.database
       .ref('/{uid}/send')
       .onUpdate((change,context) => {

    const uid = context.params.uid;

    return admin.database().ref(uid+'/messagesToSend').once('value').then(snapshot => {

      snapshot.forEach(function(childSnapshot) {

          var key = childSnapshot.key;
          var messageData = childSnapshot.val();
          **if (messageData.sanitized) return true;**
          var message = messageData.messageText;
          var phoneNumber = messageData.recipientNumber;

          const textMessage = {
            body: `From My App - ${message}`,
            from: twilioNumber, // From Twilio number
            to: phoneNumber  // Text to this number
          }
          return client.messages.create(textMessage)
        })
        **return snapshot.ref.toString();**
    });
}); 

Обратите внимание, что строки, отмеченные ** на обоих концах, указывают, что я знаю, что мне нужно вернутьсячто-то, основанное на полученных мной сообщениях об ошибках, указывающих, что «Each then () должен возвращать значение или throw».

1 Ответ

0 голосов
/ 27 сентября 2018

Я предполагаю, что вы используете библиотеку twilio-node, которая использует обещания: https://www.npmjs.com/package/twilio.

Поскольку вы хотите отправлять несколько сообщений параллельно, вы должны использовать Promise.all() следующим образом:

const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const twilio = require('twilio')

const accountSid = functions.config().twilio.sid;
const authToken  = functions.config().twilio.token;

const client = new twilio(accountSid, authToken);

const twilioNumber = functions.config().twilio.number;


// Start cloud function
exports.sendSecrets = functions.database
       .ref('/{uid}/send')
       .onUpdate((change,context) => {

    const uid = context.params.uid;

    return admin.database().ref(uid+'/messagesToSend').once('value')
    .then(snapshot => {

      const promises = [];

      snapshot.forEach(function(childSnapshot) {

          var key = childSnapshot.key;
          var messageData = childSnapshot.val();
          //**if (messageData.sanitized) return true;**
          var message = messageData.messageText;
          var phoneNumber = messageData.recipientNumber;

          const textMessage = {
            body: `From My App - ${message}`,
            from: twilioNumber, // From Twilio number
            to: phoneNumber  // Text to this number
          }

          promises.push(client.messages.create(textMessage));
      })

      return Promise.all(promises);
    })
    // Edits made below to parentheses/brackets
    .then(results => {
      //Do whatever you want !!
      // e.g. print the results which will be an array of messages
      // (see https://www.twilio.com/docs/libraries/node#testing-your-installation)
    })            
}); 

Вы также можете просто вернуть Promise.all() следующим образом:

....
     return Promise.all(promises);
   })
}); 
...