облачная функция для отправки уведомлений fcm на коллекцию токенов - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь отправить уведомление при каждом обновлении моей базы данных. У меня работает сторона onUpdate, но я новичок в FCM и застрял при отправке уведомления. Структура коллекции устройств выглядит следующим образом:

+devices/
+tokenId/
-tokenId:njurhvnlkdnvlksnvlñaksnvlkak
-userId:nkjnjfnwjfnwlknlkdwqkwdkqwdd

У меня сейчас есть функция, которая застревает с пустым значением токена:

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

admin.initializeApp();

const db = admin.firestore();

const settings = { timestampsInSnapshots: true };
db.settings(settings);

.....

exports.fcmSend = functions.firestore
  .document(`chats/{chatId}`).onUpdate((change, context) => {

    const messageArray = change.after.data().messages;
    const message = messageArray[(messageArray.length-1)].content
    if (!change.after.data()) {
        return console.log('nothing new');
      }
    const payload = {
          notification: {
            title: "nuevo co-lab",
            body: message,
          }
        };
  
    return admin.database().ref(`/devices`)
         .once('value')
          .then(token => token.val())
          .then(userFcmToken => {
            console.log("Sending...", userFcmToken);
            return admin.messaging().sendToDevice(userFcmToken, payload)
          })
          .then(res => {
            console.log("Sent Successfully", res);
          })
          .catch(err => {
            console.log("Error: ", err);
          });
  
  });

Я не могу получить токен из базы данных. Это ноль или неопределенный. Может кто-нибудь помочь мне с этой второй частью функции? Заранее большое спасибо!

1 Ответ

1 голос
/ 15 января 2020

Спасибо Фрэнк за совет! Мне удалось решить проблему с этим кодом на тот случай, если он кому-нибудь понадобится:

const payload = {
      notification: {
        title: "nuevo mensaje de co-lab",
        body: message,
      }
    };

       // Get the list of device tokens.
const allTokens = await admin.firestore().collection('devices').get();
const tokens = [];
allTokens.forEach((tokenDoc) => {
  tokens.push(tokenDoc.id);
});

if (tokens.length > 0) {
  // Send notifications to all tokens.
  return await admin.messaging().sendToDevice(tokens, payload);     
}else {
  return null;
}
...