2
exports.addNewValue = functions.database.ref('/path') 
.onWrite(event => {  
    event.data.adminRef.update({"timeSnapshot":Date.now()})}) 

次のようにはないのでDate.nowは()関数内で無限ループが発生することが表示されますか?クラウド機能は

+0

'onWrite()'火災時にのみ値書かれた変更です。 'Date.now()'を書くことは変更を生成しますが、固定値 'newString'は(最初から)変更しません。この機能の目標は何ですか?リッスンしている場所の値を変更するには、このタイプのループを避ける必要があります。 –

答えて

1

は、私は次のように正常に動作すべきだと思う: -

exports.addNewValue = functions.database.ref('/path/timeSnapshot') 
    .onWrite(event => { event.data.adminRef.set(Date.now()) }) 

上記の背後にあるロジックは、あなたが(たとえば、あなたのケースで/pathとして)上位ノード上のトリガ機能を入れたときに、その関数があろうとその子ノードのいずれかに変更が加えられるたびに(あなたの場合は/timestamp)、つまり無限ループが発生します。

したがって、一般的なプラクティスとして、効率とコスト効率のために、トリガー機能が可能な限り最も低いパスノードを持つことを確認してください。あなたのデータを平らにすることは本当にこれでも役に立ちます。

3

あなたが戻って以前に変更されたデータベース内の同じ場所に書き込む場合は、この一連のイベントを期待することができます:

  1. 機能は、クライアントからの最初の変化にトリガされ
  2. 機能を書き戻しますデータベースへ
  3. 機能のでステップ#2

すべてがフィルタ経路に一致するデータベースに書き込み、さらにそれらのFR中の書き込みの第二回トリガされます同じ関数内のomは、関数をトリガします。

手順3では、2番目の関数呼び出しでデータベースに書き戻す必要があるかどうかを判断する方法が必要です。別の書き込みを必要としない場合は、関数は早期に戻り、別の書き込みをトリガーしません。通常は、関数に渡されたイベントのデータを調べ、初めて変更されたかどうかを調べます。これには、データベースにフラグが設定されているか、変更したデータに変更が必要ないかどうかを調べる必要があります。

Firebaseチームによって提供されたcode samplesの多くがこれを行います。特に、text moderationをご覧ください。また、video that describes the problemと可能な解決策があります。最終的には、ニーズに合った戦略を立てる責任があります。あなたは.once(「値」)を使用してみてください照会に問題がここに到着した場合

0

こと...それはあなたが一度だけ...つまり

ref.orderByChild("isLive").equalTo(true).once("value" , function(snapshot) { 

代わりの

基準点を見ていることを意味します
ref.orderByChild("isLive").equalTo(true).on("value", function(snapshot) { 

秒あなたはすべての時間を聞いて、そしてときREFのデータが変更されますよう、リスナーが変更を受信して​​、ブロック内のコードを実行されます再び

関連する問題