bugfix> javascript > 投稿

リアルタイムデータベースにノードが作成されると、多くのトークンにメッセージを送信する必要があります。
私はそのコードを使用していますが、通知はすべて失われます(人々はそれを受け取りません)。

exports.sendMessage = functions.database.ref('/messages/{messageId}')
.onCreate((snapshot, context) => {
 const original = snapshot.val();
 let msg = {
    message: {
        data: {
            title: 'title2 test',
            body: 'body2 test',
            notify_type: 'chat_message',
            notify_id: ((new Date()).getTime()).toString(),
        },
        apns: {
            headers: {
                'apns-priority': '10',
                'apns-expiration': '0'
            },
            payload: {
                aps: { contentAvailable: true, sound:'' },
                'acme1': 'bar',
                title: 'title test',
                body: 'body test',
                notify_type: 'chat_message',
                notify_id: ((new Date()).getTime()).toString()
            }
        },
        token: token
    }
};
 var query = firebase.database().ref("users");
 return query.once("value")
      .then(function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
          var user = childSnapshot.val();
          var token = user.token;
          var username = user.username;
          msg.message.token = token;
          admin.messaging().send(msg.message).then((response) => {
                console.log('message sent to '+username);
            }).catch((error) => {
                console.log(error);
            });              
      });
    });
});

「リターン」プロミスは正しいですか?すべての「admin.messagging()Promise」を待つ必要があると思いますが、どうすればこれができるのかわかりません。

どうもありがとうございます。

回答 3 件
  • これは、トークンの配列にFCMを送信する方法です。

     return Promise.all([admin.database().ref(`/users/${user}/account/tokensArray`).once('value')]).then(results => {
        const tokens = results[0];
        if (!tokens.hasChildren()) return null;
        let payload = {
          notification: {
            title: 'title',
            body: 'message',
            icon: 'icon-192x192.png'
          }
        };
        const tokensList = Object.keys(tokens.val());
        return admin.messaging().sendToDevice(tokensList, payload);
      });
    
    

  • トークンの配列に通知を送信できます。このコードを使用して通知を送信しています

    return admin.messaging().sendToDevice(deviceTokenArray, payload, options).then(response => {
      console.log("Message successfully sent : " + response.successCount)
      console.log("Message unsuccessfully sent : " + response.failureCount)
    });
    
    

    ここでより多くの情報を見つけることができると思います https://firebase.google.com/docs/cloud-messaging/admin/legacy-fcm

  • すべての送信アクションに対してPromiseを返すには、コードを次のように変更します。

    return query.once("value")
          .then(function(snapshot) {
            var allPromises = [];
            snapshot.forEach(function(childSnapshot) {
              var user = childSnapshot.val();
              var token = user.token;
              var username = user.username;
              msg.message.token = token;
              const promise = admin.messaging().send(msg.message).then((response) => {
                    console.log('message sent to '+username);
                }).catch((error) => {
                    console.log(error);
                });
              allPromises.push(promise);              
          });
          return Promise.all(allPromises);
        });
    
    

あなたの答え