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