繁体   English   中英

Firebase Cloud Function错误:提供给sendToDevice()的注册令牌必须是非空字符串或非空数组

[英]Firebase Cloud Function error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array

我想在Firebase实时数据库中创建对象confirmGuest时向所有确认来宾的用户发送通知。

所以,我首先从confirmedGuests对象创建一个包含所有用户的数组。 然后,我遍历所有这些用户并将他们的deviceTokens推送到deviceTokens数组。 数组allDeviceTokens应该是confirmGuests中所有用户的设备令牌数组。

但是,当创建confirmGuests对象时,该函数返回错误。

下面是我的云功能


    exports.sendNotification = functions.database
    .ref('/feed/{pushId}/confirmedGuests')
    .onCreate((snapshot, context) => {
        const pushId = context.params.pushId;
        if (!pushId) {
            return console.log('missing mandatory params for sending push.')
        }
        let allDeviceTokens = []
        let guestIds = []
        const payload = {
            notification: {
                title: 'Your request has been confirmed!',
                body: `Tap to open`
            },
            data: {
                taskId: pushId,
                notifType: 'OPEN_DETAILS', // To tell the app what kind of notification this is.
            }
        };
          let confGuestsData = snapshot.val();
          let confGuestItems = Object.keys(confGuestsData).map(function(key) {
              return confGuestsData[key];
          });
          confGuestItems.map(guest => {
            guestIds.push(guest.id)
          })
          for(let i=0; i<guestIds.length; i++){
            let userId = guestIds[i]
            admin.database().ref(`/users/${userId}/deviceTokens`).once('value', (tokenSnapshot) => {
              let userData = tokenSnapshot.val();
              let userItem = Object.keys(userData).map(function(key) {
                  return userData[key];
              });
              userItem.map(item => allDeviceTokens.push(item))
            })
          }
          return admin.messaging().sendToDevice(allDeviceTokens, payload);
    });

您正在从实时数据库加载每个用户的设备令牌:

admin.database().ref(`/users/${userId}/deviceTokens`).once('value', (tokenSnapshot) => {

此加载操作异步发生。 这意味着,当admin.messaging().sendToDevice(allDeviceTokens, payload)调用运行时,尚未加载令牌。

要解决此问题,您需要等到所有令牌都已加载,然后再调用sendToDevice() 常见的方法是使用Promise.all()

let promises = [];
for(let i=0; i<guestIds.length; i++){
  let userId = guestIds[i]
  let promise = admin.database().ref(`/users/${userId}/deviceTokens`).once('value', (tokenSnapshot) => {
    let userData = tokenSnapshot.val();
    let userItem = Object.keys(userData).map(function(key) {
      return userData[key];
    });
    userItem.map(item => allDeviceTokens.push(item))
    return true;
  })
  promises.push(promise);
}
return Promise.all(promises).then(() => {
  return admin.messaging().sendToDevice(allDeviceTokens, payload);
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM