Firebase admin SDK FCM 错误 需要主题、令牌或条件之一

Posted

技术标签:

【中文标题】Firebase admin SDK FCM 错误 需要主题、令牌或条件之一【英文标题】:Firebase admin SDK FCM error Exactly one of topic, token or condition is required 【发布时间】:2020-05-26 22:20:12 【问题描述】:

我正在修复发生的错误消息,但它以前也可以工作。我正在发送带有多个令牌的 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】:

就像@vijayst 提到的评论一样。我的问题是我正在使用 send(message) 并在我的消息中包含tokens 的数组。但是, send() 不接受这一点。 Send 可以接受“主题”,但要发送到令牌数组,您需要使用 sendMulticast(message)

send

sendMulticast

【讨论】:

我们必须正确使用send、sendMulticast。 firebase.google.com/docs/cloud-messaging/send-message【参考方案2】:

解决方案 - 避免向 Firebase 发送空 fcm 令牌。

我得到了解决方案。我列出了我所有的 firebase 令牌,我的数据库中有一些空令牌,这是主要问题。

当我们发送空 fcm 令牌时,Firebase 给我们以下错误

Exactly one of topic, token or condition is required

【讨论】:

是的,我想这就是答案。我们的应用程序经过了返工,显然一些用户的令牌被删除了。检查,是的,他们是空的:) 同样的事情,但我没有空的 fcm 令牌 请通过打印每个令牌再次检查它。它可以为空或 null。 就我而言,我使用的是 send 而不是 sendMulticast

以上是关于Firebase admin SDK FCM 错误 需要主题、令牌或条件之一的主要内容,如果未能解决你的问题,请参考以下文章

FCM - 为啥在较新的 Firebase Admin SDK 中不再支持 FCM 直接通道?

K8S 集群中的 Google FCM firebase-admin initializeApp() 错误

我可以通过 Firebase Admin SDK 接收来自设备的上游消息,而无需在应用程序服务器上实现 XMPP

如何在 iOS 上显示使用 firebase-cpp-sdk 收到的 FCM“数据”消息?

无法使用 NodeJS Admin SDK 向设备发送 FCM 通知

如何在没有 Firebase SDK(即通过 REST)的情况下生成 FCM 注册令牌?