2017-03-16 9 views
5

私はfirebase-queueのクラウド機能に移動するために、Firebase用のクラウド機能を試しています。特定のrefで新しいノードを作成するたびに、最後に更新されたタイムスタンプを追加する単純な関数を追加しました。この関数は次のようになります。Firebaseのクラウド機能が何度も呼び出されました

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

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

exports.setLastUpdatedTimestamp = functions.database.ref('/nodes/{nodeId}') 
    .onWrite(event => { 
    const original = event.data.val(); 
    console.log('Adding lastUpdatedTimestamp to node ', original.name); 
    return event.data.ref.child('lastUpdatedAtFromFC').set(Date.now()); 
    }); 

私はこの雲の機能を展開し、私のアプリからわずか1つのノードを追加しました。私はFirebase Functionsダッシュボードに行き、その機能が169回呼び出されたことを知り、理由は分かりません。ログを見ると、過去のすべてのノードにも関数を追加するようなログが表示されます。

onWritechild_addedのような振る舞いをしていて、既存のすべてのエンティティの機能を同様に実行するのでしょうか?

この操作は、機能を変更して再度展開するたびに繰り返されますか?

新しく追加されたノードでは1回しか実行されませんでした。

+0

以下の回答を確認してください –

答えて

5

これは、データベース書き込みを処理する関数を書くときによくある間違いです。ある場所で最初の書き込みのイベントを処理すると、その同じ場所に2回目の書き込みを行い、2回目の書き込みは関数を再度実行する別のイベントをトリガーします。これは無限ループになります。

関数には、2番目の書き込みイベントをデータベースに書き込まないようにするロジックが必要です。それはループを止めるでしょう。あなたの場合、最後の更新時間を設定する関数は必要ありません。これをクライアント上の特別な値で行うことで、現在の時刻をフィールドに挿入するようにサーバーに指示することができます。

https://firebase.google.com/docs/reference/js/firebase.database.ServerValue#.TIMESTAMP

+0

答えをありがとう。このように最後に更新されたタイムスタンプを更新することは、私がやろうと思っていたものではなく、クラウド機能を試してみるということでした。 –

+0

それは公正です - そのような値を自動的に更新することは、まさにユースケースです。その終了時にコードを確実に作成することは時には面倒かもしれません。 :-) –

+0

さて、私はこの間違いを犯したときに私は支払った計画にいなかったのはうれしいです。 :)どのくらい私は請求されたか分からない。一晩中実行したままにしておき、クォータに達したために関数を呼び出せない関数コンソールに多数のログが表示されることがあります。 –

8

ダグは正しいです。さらに、無限ループで機能が停止している場合は、ループを修正して関数を再デプロイ(firebase deployを使用)したり、関数を完全に削除したりすることをお勧めしますindex.jsから削除し、firebase deployを実行してください)。

+1

クラウド機能の停止に関するヒントをありがとう。 –

+2

将来的に管理ポータル経由で機能を無効にする方法が本当にあると期待しています。:) – mtb

+1

機能リクエストがありました。ありがとう! :) –

関連する問題