web-dev-qa-db-ja.com

Firebase HTTP Cloud Functions-データベースを1回読み取ります

Firebase HTTPs機能があります。この関数は、クエリパラメーターに基づいてFirebaseデータベースから値を読み取り、このデータに基づいて結果を返す必要があります。

Firebase JS SDKは、次を使用してこれを行うように指示しています。

return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = snapshot.val().username;
  // ...
});

ただし、クラウド機能の例には次のものがあります。

var functions = require('firebase-functions');

functions.database.ref('/');

ただし、DB参照にはonceメソッドはなく、onWriteのみがあります( https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder )。これは、明らかにHTTP関数ではなく、DB書き込み関数用です。

HTTP関数でデータベースから1回読み取る正しい方法はありますか?通常のFirebase SDKを使用できますか、それとももっと良い方法がありますか?

ありがとう。

14
SteveEdson

ここでパラメーターを取得する方法とMichael Blightから クラウド関数の内部からクエリを実行する方法への答えを取得する方法についての回答を組み合わせて解決策を見つけましたか?

答えは、firebase-adminを使用するために必要なものも示しています。

My-project.firebaseapp.com/event/123/を呼び出すと、次のように動作します。

var functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.showEvent = functions.https.onRequest((req, res) => {
    const params = req.url.split("/");
    const eventId = params[2];
    return admin.database().ref('events/' + eventId).once('value', (snapshot) => {
        var event = snapshot.val();
        res.send(`
            <!doctype html>
            <html>
                <head>
                    <title>${event.name}</title>
                </head>
                <body>
                    <h1>Title ${event. name} in ${event.city}</h1>
                </body>
            </html>`
        );
     });
});
37
MGR Programming

あなたは2つの部分を混乱させています:

  • _firebase-functions_モジュール。これには、functions.database.ref('/path').onWrite()を使用したデータベース呼び出しに基づいたtriggerへのロジックが含まれます。
  • _firebase-admin_モジュール。これにより、関数でデータベースを呼び出しできます。

HTTP関数があるため、 HTTP関数のドキュメントが示すように としてトリガーする必要があります。

_exports.data = functions.https.onRequest((req, res) => {
  // ...
});
_

次に、関数で Admin SDKのドキュメントが示す としてデータベースにアクセスします。

_return admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = snapshot.val().username;
  // ...
});
_

合計で:

_exports.date = functions.https.onRequest((req, res) => {
  admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {
    var username = snapshot.val().username;
    res.status(200).send(username);
  });
});
_

これはトリッキーなパターンであることに注意してください。データベースへの呼び出しは非同期で行われ、完了するまでに時間がかかる場合があります。その待機中に、HTTP機能がタイムアウトし、Google Cloud Functionsシステムによって終了される場合があります。 ドキュメントのこのセクション を参照してください。

一般的なルールとして、Firebase Database SDKまたはそのREST APIを使用してデータベースにアクセスし、ミドルウェアとしてHTTP機能に依存しないことをお勧めします。

10