2017-08-21 9 views
1

私はfirebaseクラウド関数を持っていますが、このように私の外部のAPI終点を呼び出しています。ファイヤーベースのクラウド関数が一括更新と矛盾しています

const functions = require('firebase-functions'); 
var admin = require("firebase-admin"); 
admin.initializeApp(functions.config().firebase); 
var request = require('request'); 
var moment = require('moment'); 
var rp = require('request-promise'); 

var db = admin.database(); 

exports.onCheckIn = functions.database.ref('/news/{newsId}/{entryId}') 
     .onCreate(event => { 
     console.log("Event Triggered"); 
     var eventSnapshot = event.data.val(); 
     request.post({ 
       url: 'http://MyCustomURL/endpoint/', 
       form: { 
       data: eventSnapshot.data 
      } 
      }, function(error, response, body){ 

       console.log(response); 

      }); 



     }) 

私はBlazeプランを使用していますが、これは完全にうまく動作しています。しかし、問題は、私が大量のデータ(約50から100のエントリ)を作成しているときに、私のカスタムURLへのHTTPリクエストが正しく機能していないことです.1つか2つのHTTPリクエストはスキップされています。

カスタムサーバーをデバッグして、firebaseからの不足している要求を受信して​​いないことがわかりました。しかし、私はまた、クラウド機能のログをチェックし、すべてのイベントが正しくトリガーされていることがわかります。

何が問題なのですか?私は間違って何かしていますか?

答えて

5

あなたの関数から値を返すわけではありません。これは、クラウド関数は、最後のステートメントが実行された後にその関数が処理されたとみなすことを意味します。しかし、関数内で非同期のHTTP呼び出しを行っているので、その呼び出しはまだ完了していない可能性があります。残念なことに、あなたは未処理のコールがあるという事実についてクラウドファンクションには言わないので、あなたが帰った後はいつでもあなたの機能を停止させるかもしれません。

解決策は、HTTP要求が完了した後に解決する約束を返すことです。

exports.onCheckIn = functions.database.ref('/news/{newsId}/{entryId}') 
.onCreate(event => { 
    console.log("Event Triggered"); 
    var eventSnapshot = event.data.val(); 
    return rp.post({ 
     url: 'http://MyCustomURL/endpoint/', 
     form: { 
     data: eventSnapshot.data 
     } 
    }); 
}) 

これは、またはJavaScriptとFirebaseとJavaScriptに新しい開発者のための共通の問題であり、かつでカバーされています:あなたはすでにrequest-promiseを含めているので、これは簡単です

関連する問題