0

我正在为fcmTokens储存Firebase云消息的令牌。每个用户最多有三个令牌。Firebase数据库 - 云功能查询

{ 
    "uid1" : { 
    "-Kt8Skx5sa-IeXhKBs4G" : { 
     "uid1" : "token1" 
    } 
    }, 
    "uid2" : { 
    "-Kt8Xt1lT7OeyKJBs1ps" : { 
     "uid2" : "token1" 
    }, 
    "-Kt8Xt1lT7OeyKJz892k" : { 
     "uid2" : "token2" 
    } 
    } 
} 

ids是一个包含需要接收消息的用户ID的数组。我不能 似乎获得每个用户的令牌。

错误:

Error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array. 

下面是我现在有:

function sendFcm(ids) { 

    const payload = { 
    notification: { 
     title: 'You have been invited to an event!', 
     body: 'Event body', 
     icon: "https://placeimg.com/250/250/people" 
    } 
    }; 

    for (const key in ids) { 
    if (ids.hasOwnProperty(key)) { 

     admin.database() 
     .ref(`/fcmTokens/${ids[key]}/{pushId}/${ids[key]}`) 
     .once('value') 
     .then(token => token.val()) 
     .then(userFcmToken => { 
      return admin.messaging().sendToDevice(userFcmToken, payload) 
     }) 
     .then(res => { 
      console.log("Sent Successfully"), res 
     }) 
     .catch(err => { 
      console.log(err); 
     }) 
    } 
    } 
} 

回答

1

你的数据结构似乎效率低下你用它做什么。如果每个用户都有一组令牌,请精确保留:每个用户的一组令牌。

{ 
    "uid1" : { 
    "token1": true 
    }, 
    "uid2" : { 
    "token1": true, 
    "token2": true, 
    "token3": true 
    } 
} 

然后:

for (const key in ids) { 
    if (ids.hasOwnProperty(key)) { 
    admin.database() 
     .ref(`/fcmTokens/${ids[key]}`) 
     .once('value') 
     .then(snapshot => { 
     snapshot.forEach((tokenSnapshot) => { 
      let userFcmToken = tokenSnapshot.key; 
      admin.messaging().sendToDevice(userFcmToken, payload); 
     }) 
     }) 
    } 
+0

有道理。 Firebase仍然很新。谢谢! – Ciprian