2017-10-14 7 views
1

マイfirebaseデータベース構造はこのようになります変更されますfirebaseのためのクラウド関数を記述しますどのように時間に基づいてデータ

-events 
    -uniqueEventId 
     -endTimeStamp: 1507949100 
     -active: true 
    -uniqueEventId2 
     -endTimeStamp: 1807949100 
     -active: true 
    -uniqueEventId3 
     -endTimeStamp: 1900949100 
     -active: true 

をどのように私は、現在の時間の前にタイムスタンプを持つすべてのイベントを取得することができます機能を曇らせる行いますアクティブにfalseを設定します。

答えて

3

この場合、クラウド機能をどのようにトリガーするかはわかりません。私はあなたが単にブラウザまたはWebフックから呼び出すことができるように、あなたはHTTPトリガが必要と仮定します。

exports.updateStatus = functions.https.onRequest((req, res) => { 
    // ... 
    res.status(200).send("done"); 
}); 

次をアップあなたはこの関数内でリアルタイムデータベースにアクセスする必要があります:あなたは、基本的なHTTP-triggered functionで始まる意味

。あなたは、あなたのコード内で簡単に管理アクセスを提供しますFirebase Admin SDKを使用しますことを行うには:

const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

exports.updateStatus = functions.https.onRequest((req, res) => { 
    // ... 
    res.status(200).send("done"); 
}); 

をその後、我々はデータを変更するために実際のコードを取得します。これは標準のデータベースアクセスコードであり、クラウド機能とはほとんど関係がありません。あなたはタイムスタンプを照会したい。この場合、結果をループし、activeプロパティを設定します。

const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

exports.updateStatus = functions.https.onRequest((req, res) => { 
    let now = Date.now(); 
    let query = admin.database().ref("events").orderByChild("timestamp").startAt(now); 
    query.once("value").then(function(snapshot) { 
    var promises = []; 
    snapshot.forEach(function(child) { 
     promises.push(child.ref.update({ active: false })); 
    }) 
    Promise.all(promises).then(function() { 
     res.status(200).send("done"); 
    }); 
    }); 
}); 

それは多くの非同期書き込み操作を扱うので、最後のコードは、少しトリッキーされていること。クラウド関数は、クライアントに応答を送信した後で関数を終了させるため、すべての非同期書き込みが完了した後にのみ応答を返すことが重要です。私はPromise.all()を使っています。この非同期性の詳細については、the documentationthis blog post、およびthis videoを参照してください。

詳細については、documentation for the Firebase Admin SDKを勉強することをおすすめします。

関連する問題