0

我正在從我的功能firebase下載,我無法解決如何訪問我已下載的數組。Firebase的雲端函數:如何訪問我剛剛從Firebase獲得的陣列?

這是我的代碼:

exports.messageAdded = functions.database.ref('cities/barcelona/pickUp/gamesDetailed/{gameId}/wal/{messageId}').onWrite(event => { 


    const getPlayer1sIdPromise = admin.database().ref(`/cities/barcelona/pickUp/gamesDetailed/gameId/pla1`).once('value'); 
    const getPlayer2sIdPromise = admin.database().ref(`/cities/barcelona/pickUp/gamesDetailed/gameId/pla2`).once('value'); 


    const getInstanceIdPromise = admin.database().ref(`/users/usersDetailed/${receiverUid}/deviceID`).once('value'); 

    return Promise.all([getPlayer1sIdPromise, getPlayer2sIdPromise]).then(results => { 
     const player1Ids = results[0].val(); 

     // PROBLEM IS HERE 

     console.log(player1Ids); 
     console.log(player1Ids[0]); 
     console.log(results[0]); 
     console.log(results[0].val()[0]); 


     Promise.all([getInstanceIdPromise, getSenderUidPromise]).then(results => { 
      const instanceId = results[0].val(); 
      const sender = results[1]; 

      const payload = { 
      notification: { 
      title: senderName, 
      body: messageText, 
      icon: sender.photoURL 
      } 
      }; 

      admin.messaging().sendToDevice(instanceId, payload) 
      .then(function (response) { 
        console.log("Successfully sent message:", response.results); 

        console.log("Successfully sent message:", response); 
        }) 
      .catch(function (error) { 
        console.log("Error sending message:", error); 
        }); 
      }); 

     }); 

    }); 

在代碼中,我聲明一點問題出在哪裏。在那裏我無法解決如何訪問player1Ids。我回來的東西應該是一個數組,我想訪問第一個值,但我不知道該怎麼做。

這是完全沒有經驗的JavaScript和我很抱歉,如果這是一個重複的問題,但我看,似乎無法找到一個,但我不知道什麼搜索。

這是我使用的數據結構:

root/ 
    |___ ... 
    |  |___ pla1 
    |  |  |___ USER_ID_HERE: userName 
    |  |  |___ ... 
    |  |___ pla2 
    |    |___ USER_ID_HERE: userName 
    |    |___ ... 

肯定是在我火力數據庫有一個數組有這麼希望我可以找到如何對其進行訪問。

在此先感謝。

+0

什麼'的console.log(results.val())'和'的console.log(結果[0] .VAL())'在控制檯中顯示? –

回答

2

從我在這裏可以看到,你的代碼中有幾個問題。您是否在Firebase控制檯中檢查了錯誤消息?這可能會給我們一些很好的提示。

首先,我看不到在您的代碼中定義的getPlayer2sIdPromise,但您好像在Promise.all()調用中使用它。

這可能就是爲什麼你的代碼不會更進一步的原因。

無論如何,你會做這樣的(我刪除代碼的幾個部分只是把重點放在重要的組成部分):

exports.messageAdded = functions.database.ref('cities/barcelona/pickUp/gamesDetailed/{gameId}/wal/{messageId}').onWrite(event => { 

     const getPlayerOneID = admin.database().ref(`/cities/barcelona/pickUp/gamesDetailed/gameId/pla1`).once('value'); 

      return Promise.all([getPlayerOneID]).then(results => { 

       const playerOneIdSnapshot = results[0]; 

       // ...And then you can access the value like so : 

       const playerOneIdSnapshotValue = playerOneIdSnapshot.val(); 

      }); 

    }); 


現在,從我所看到的你的數據庫結構是這樣的:

root/ 
|___ ... 
|      |___ pla1 
|              |___ userId: USER_ID_HERE 
|              |___ ... 

在這種情況下,你就可以訪問用戶ID如下:

const userID = playerOneIdSnapshotValue.userId; 

這可能有點不同,這取決於你如何設置你的數據庫!

讓我知道,如果它的工作原理:)

+0

第一位是我的錯誤。我刪除了部分代碼以使問題更清楚,但我也刪除了getPlayer2sIDPromise。我現在編輯了上面的代碼,使其更清晰。 我應該添加我使用的數據結構,所以我會將其添加到我的問題中。這與你的猜測非常相似,但用戶標識已經移動。我認爲這會改變你的答案。 –

+1

哦,好吧!那麼在這種情況下,我建議你改變一下你的數據庫結構,以便根據最佳實踐將用戶標識存儲在快照值中,否則,如你所見,它很難找到你的標識。你的代碼的其他部分看起來不錯,所以它應該可以在對你的數據庫結構進行一些修改之後有效地工作,並像我向你展示的那樣獲取快照值。這會爲你節省很多時間以後相信我:) – Alex