Node.js firebase管理员:获取失败通知传递结果的令牌

Node.js firebase管理员:获取失败通知传递结果的令牌,node.js,push-notification,firebase-admin,Node.js,Push Notification,Firebase Admin,假设我们希望向两个注册令牌(仅Android设备,无iOS)发送通知,如下所示: const tokens = ['tokenA', 'tokenB']; const payload = {badge: 1, title: 'Hello', body: 'world'}; const options = {priority: 'high',contentAvailable: false, timeToLive: 60 * 60 * 24}; const admin = FirebaseAdm

假设我们希望向两个注册令牌(仅Android设备,无iOS)发送通知,如下所示:

const tokens = ['tokenA', 'tokenB'];

const payload = {badge: 1, title: 'Hello', body: 'world'};
const options = {priority: 'high',contentAvailable: false, timeToLive: 60 * 60 * 24};

const admin = FirebaseAdmin.initializeApp({/*config here...*/});

admin.messaging().sendToDevice(deviceTokens, payload, options)
  .then((response) => {

    response.results.forEach((deviceResult) => {
      if (deviceResult.error) {
        console.log('Delivery failed. Showing result:\n', deviceResult);
      }
    });

});
使用
tokenB
注册其设备的用户从其设备中删除了应用程序。因此,该令牌不再向firebase注册。 错误对象如下所示:

传递失败。显示结果:


{"error":
  {
    "code":"messaging/registration-token-not-registered",
    "message":"The provided registration token is not registered. A previously valid registration token can be unregistered for a variety of reasons. See the error documentation for more details. Remove this registration token and stop using it to send messages."
  }
}
问题: 我的问题是,我只知道其中一次交付失败。但我不知道这个错误与哪个标记有关。因此,我无法从数据库中删除过期的令牌

问题: 有没有办法找出交付失败的代币


Github问题链接:

您需要使用
forEach
中的索引,并从传入
sendToDevice
的数组中获取令牌

官方文件:

这看起来像是一种黑客行为,但当我有一个用户的多个设备令牌时,它对我有效,因为每当他们登录时,我必须存储新的令牌

const tokens = ['tokenA', 'tokenB'];

const payload = {badge: 1, title: 'Hello', body: 'world'};
const options = {priority: 'high',contentAvailable: false, timeToLive: 60 * 60 * 24};

const admin = FirebaseAdmin.initializeApp({/*config here...*/});

admin.messaging().sendToDevice(deviceTokens, payload, options)
  .then((response) => {

    response.results.forEach((deviceResult,index) => {
      if (deviceResult.error) {
        let failedToken = tokens[index];
        // Now use this token to delete it from your DB, or mark it failed according to your requirements.
      }
    });

});

firbease示例中也使用了此方法:

FYI:我已经就这个主题创建了一个GitHub问题:谢谢您的回答。这是一个有价值的信息,我可以用它来解决问题。我想知道这有多可靠,我不想冒险删除已注册的代币。如果这是正确的方法,firebase人员应该将其添加到文档中。是的,他们应该将其添加到文档中。关于可靠性,我认为FCM服务器的响应保持了数组的顺序,在上面提到的链接中看到了实现代码。是的,但我不想“假设”FCM保持了数组的顺序。我需要证据。文档中的一个注释就足够了。我将在我最近创建的GitHub.com/firebase/firebase-admin-node/issues/600的GitHub问题中提到您的解决方案,并在问题中添加指向其示例的链接。