I am fixing an error message which occurred, but it also used to work before. I am sending FCM notification with multiple tokens and am getting the following error
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>
The code producing the error:
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 };
}
}
Thoughts on what could be wrong?
On initial startup of your app, the FCM SDK generates a registration token for the client app instance. This is the token that you must include in targeted send requests from the API, or add to topic subscriptions for targeting topics.
Solution - Avoid sending empty fcm token to Firebase.
I got the solution. I listed all my firebase token and there were some empty tokens in my database which was the main problem.
When we send empty fcm token, Firebase gives us below error
Exactly one of topic, token or condition is required
Like the comment mentioned by @vijayst. My Issue was that I was using send(message) and including in my message an array of tokens
. However, send() doesn't accept that. Send could accept a "topic", but to send to an array of tokens, you need to use sendMulticast(message)
send
sendMulticast
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With