Firebase admin SDK FCM error Точно один из топи c, токен или условие требуется - PullRequest
3 голосов
/ 11 февраля 2020

Я исправляю появившееся сообщение об ошибке, но раньше оно также работало. Я отправляю уведомление FCM с несколькими токенами и получаю следующую ошибку

0|api      | 2020-2-11 13:26:26   [ExceptionsHandler] Exactly one of topic, token or condition is required
0|api      |  +542752ms
0|api      | Error: Exactly one of topic, token or condition is required
0|api      |     at FirebaseMessagingError.FirebaseError [as constructor] (/var/www/tokee-api-new/node_modules/firebase-admin/lib/utils/error.js:42:28)
0|api      |     at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/var/www/tokee-api-new/node_modules/firebase-admin/lib/utils/error.js:88:28)
0|api      |     at new FirebaseMessagingError (/var/www/tokee-api-new/node_modules/firebase-admin/lib/utils/error.js:254:16)        0|api      |     at Object.validateMessage (/var/www/tokee-api-new/node_modules/firebase-admin/lib/messaging/messaging-types.js:46:15)
0|api      |     at /var/www/tokee-api-new/node_modules/firebase-admin/lib/messaging/messaging.js:265:31
0|api      |     at Array.map (<anonymous>)
0|api      |     at Messaging.sendAll (/var/www/tokee-api-new/node_modules/firebase-admin/lib/messaging/messaging.js:264:29)
0|api      |     at Messaging.sendMulticast (/var/www/tokee-api-new/node_modules/firebase-admin/lib/messaging/messaging.js:313:21)   0|api      |     at userChunks.forEach.userChunk (/var/www/tokee-api-new/src/modules/common/firebase/firebase.service.ts:154:42)     0|api      |     at Array.forEach (<anonymous>)
0|api      |     at FCMService.<anonymous> (/var/www/tokee-api-new/src/modules/common/firebase/firebase.service.ts:142:16)
0|api      |     at Generator.next (<anonymous>)
0|api      |     at /var/www/tokee-api-new/dist/src/modules/common/firebase/firebase.service.js:13:71
0|api      |     at new Promise (<anonymous>)
0|api      |     at __awaiter (/var/www/tokee-api-new/dist/src/modules/common/firebase/firebase.service.js:9:12)
0|api      |     at FCMService.sendToMany (/var/www/tokee-api-new/dist/src/modules/common/firebase/firebase.service.js:123:16)       0|api      |     at AdminNotificationController.<anonymous> (/var/www/tokee-api-new/src/modules/notification/admin-notification.controller.ts:65:42)
0|api      |     at Generator.next (<anonymous>)
0|api      |     at fulfilled (/var/www/tokee-api-new/dist/src/modules/notification/admin-notification.controller.js:16:58)
0|api      |     at <anonymous> 

Код, выдающий ошибку:

async sendToMany(users: User[], notification: VSendNotification, title = 'Title', lowPriority = false) {
    // We split emails into arrays of max. 100 size because of the limitation with FCM
    const userChunks = _.chunk(users, 100);
    const promises = [];
    userChunks.forEach(userChunk => {
      const msg: admin.messaging.MulticastMessage = {
        notification: {
          title,
          body: notification.body
        },
        tokens: userChunk.map(user => user.firebaseToken),
        android: {
          priority: lowPriority ? 'normal' : 'high'
        }
      };
      promises.push(this.app.messaging().sendMulticast(msg));
    });
    const result = await Promise.all(promises);
    let accepted = 0;
    let rejected = 0;
    result.forEach(response => {
      accepted += response.successCount;
      rejected += response.failureCount;
    });

    return { accepted, rejected, notification };
  }
}

Мысли о том, что может быть не так?

1 Ответ

2 голосов
/ 11 февраля 2020

Решение - Избегайте отправки пустого токена fcm в Firebase.

Я получил решение. Я перечислил все свои токены Firebase, и в моей базе данных было несколько пустых токенов, что было главной проблемой.

Когда мы отправляем пустой токен fcm, Firebase выдает нам ошибку ниже

Exactly one of topic, token or condition is required
...