2017-08-09 18 views

答えて

3

HTTP関数は現在、返された約束を尊重しません - 通常終了するためには送信結果が必要です。 HTTP関数が結果を送信しない場合は、タイムアウトします。

他のすべてのタイプの関数は、非同期作業が完全に完了するのを待つために返される約束を必要とします。

待機する非同期作業がない場合は、ただちに戻ることができます。

これらは、ドキュメントに記載されている3つのケースです。

+0

ありがとう@Doug Stevenson 私はresの結果を送っていますが、返された非同期コードがあればHTTP機能が有効かどうかはわかりませんでした。私がここで読んでいるドキュメントでは、HTTP機能が非同期を返し、レスポンスを送信する必要があるかのように読み込まれます:https://firebase.google.com/docs/functions/terminate-functions –

+1

HTTPトリガーは応答の送信を要求します。あなたの仕事を調整するために約束を使用する必要がある場合は、それを行いますが、関数から約束を返すことは何もしません。コード内のすべての終了ポイントで応答を送信する必要があります。 –

+0

パーフェクト、ありがとうDoug –

0

クラウド機能は、彼らが何を意味するか、次の

res.redirect()、res.send()、またはres.end()

のいずれかで "終了" を返す必要があります約束を返すことで、あなたのリアルタイムデータベースのノードを更新したクラウド機能があると想像して、HTTPリクエストに応答する前にその作業を完了したいと考えています。

例コード

let RemoveSomething = functions.https.onRequest((req, res) => { 
    cors(req, res,() => { 
     // Remove something 
     DoDatabaseWork() 
      .then(function (result) { 
       res.status(200).send(); 
      }) 
      .catch(function (err) { 
       console.error(err); 
       res.status(501).send(); 
      }); 
    }); 
}); 

更新:追加DoDatabaseWork例。

const DoDatabaseWork = function() { 
    return new Promise(function (resolve, reject) { 
     // Remove SomeNode 
     admin.database().ref('/someNode/').remove() 
      .then(function (result) { 
       resolve(); 
      }) 
      .catch(function (err) { 
       console.error(err); 
       reject(); 
      }); 
    }); 
} 
+0

2番目の例では、どのような種類の機能が表示されていませんが、HTTP機能には適切ではありません。 HTTP関数は、返された約束を現在観察していません。それらは、関数が完了したときにのみ、送信された結果をインジケータとして使用します。 –

+0

最初のコードはHTTP関数で、DoDatabaseWork "2番目の例"を呼び出し、データベース作業 "ノードの削除"を完了するのを待ちます。HTTP関数はステータスコード200または501を返します。 – Kim

+0

その場合はremove()から約束してください。そのために新しい約束をする必要はありません。 –

関連する問題