1

私はデモアプリケーションのバックエンドとしてFirebaseを使用していますが、スタックがかなり好きですが、1つの問題を抱えています。データベースから値を取得する方法を理解できません。キーがきれいになっている)。
簡単に言えば、Firebase機能に到達しようとしている別のデバイスの「フレンドリーネーム」を含む情報を、あるデバイスから送信しています。 機能コードは次のようになります。Firebaseデータベースから値を取得し、それをFirebase Cloud Functionsの値に割り当てる方法は?

exports.connectMe = functions.https.onRequest((req, res) => { 
    cors(req, res,() => { 
    admin.database().ref('calls/' + req.body.id + '/').set({ 
     target: req.body.target, 
     caller: req.body.caller, 
     time: req.body.time 
    }); 

    const target = req.body.target; 
    console.log(`target: ${target}`); 
    const targetCall = admin.database().ref(`tokens/${target}/token`); 
    console.log(targetCall); 
    // const targetValue = targetCall.val(); 
    res.status(200).send("Thanks For The Call!"); 
    });  
}); 

変数、targetCallは正しく、私が到達したいDBのエントリで指摘されたが、私は私の人生のための値を抽出することはできません。 admin.database.refにあるトークンは、http要求に配置する必要があります。どのように値を取得するのですか?コメントアウトされたコードは、変数を格納したい変数を示しますが、.val()は参照の方法ではありません。
レコードの場合、adminはコード内で先にrequire('firebase-admin');に設定されています。

答えて

1

あなたは、データベースのクエリが動作するように得るために非常に接近しています。

Firebase Documentationをご覧ください。構造化データにアクセスする方法について説明します。

exports.connectMe = functions.https.onRequest((req, res) => { 
    cors(req, res,() => { 
     const callRef = admin.database().ref('calls/' + req.body.id + '/').set({ 
      target: req.body.target, 
      caller: req.body.caller, 
      time: req.body.time 
     }); 

     const target = req.body.target; 
     console.log(`target: ${target}`); 

     const takenRef = admin.database().ref(`tokens/${target}/token`) 
      .once('value'); 

     Promise.all([callRef, takenRef]) 
      .then(results => { 
       const snapshot = results[1]; // Promise of `takenRef` 
       console.log(snapshot.val()); // This is the data from the database... 

       res.status(200).send("Thanks For The Call!"); 
      }); 
    });  
}); 

は、私はあなたがデータにアクセスすることができますあなたのクエリに.once('value').then(snapshotを追加しました、更新されたコードを参照してください。

+0

それは私が欲しかったのと同じように働いています。私はononce( 'value')が初期化以上のものだったことを理解していませんでした。 –

+0

両方の非同期操作を待つことを忘れないでください!競合状態になり、結果が一貫しない可能性があります。 Promise.all(...)勝利のために。 – Kato

1

documentationに見られるようなあなたは、機能once()を呼び出す必要があります:

targetCall.once("value", function(data) { 
    const targetValue = data.val(); 
    res.status(200).send("Thanks For The Call!"); 
}); 
関連する問題