Как использовать триггер Firebase для отправки push-уведомлений с атомарным обновлением - PullRequest
0 голосов
/ 20 ноября 2018

Я собираюсь отправлять уведомления на устройства в триггере.Триггер срабатывает при создании объекта в «/ chats / {chatId}».Объект чата имеет такую ​​структуру, как:

{
  members: {
    0: "userId1",
    1: "userId2"
  },
  ...
}

Логика, стоящая за моим кодом, состоит в чтении userToken (права каждого пользователя) для членов каждого элемента;отправлять уведомления (полезную нагрузку) на каждый токен.

Код ниже работает.

exports.onChatCreate = functions.database
  .ref("/chats/{chatId}")
  .onCreate((chatSnap, context) => {
    // const members = chatSnap.val().members; // works?!
    let database = admin.database();
    let messaging = admin.messaging();
    const chatId = context.params.chatId;
    let tokens = [];
    let notifications = [];

    const payload = {
      notification: {
        title: "MyTitle",
        body: "Notification description"
      }
    };

    chatSnap.val().members.forEach(function(m) {
      database
        .ref("users")
        .child(m)
        .once("value")
        .then(function(snapshot) {
          let fcmToken = snapshot.val().FCMToken;
          if (fcmToken) {
            tokens.push(fcmToken);
            messaging.sendToDevice(fcmToken, payload);
          }
        });
    });
    return Promise.all(notifications);
  });

Теперь я хочу отправлять уведомления с атомарным обновлением после отправки каждого токена в массив токенов.Я готовлю этот код, , но он не работает .

return loadUsers().then(users => {
  let tokens = [];
  for (let user of users) {
    tokens.push(user.pushToken);
  }
  let payload = {
    notification: {
        title: 'Title',
        body: 'Notification description'
    }
  };
  return admin.messaging().sendToDevice(tokens, payload);
});

Где я ошибаюсь?!

...