web-dev-qa-db-ja.com

Firebase OnWriteのクラウド機能

Firebaseの新しいクラウド関数を調べていますが、OnWriteを実行するときは、同じ子にデータを保存しないように注意する必要があると書かれています。 (これによりトリガーが再度起動されます)。

だから私は把握しようとしている、どのようにレコードに変更日を設定するのですか?

16
Mark

問題は、データを変更できない、または変更すべきではないということではなく、無限ループから保護する必要があるということです。たとえば、タイムスタンプを設定すると、再トリガーするタイムスタンプを設定する関数が再トリガーされる可能性があります...など。

ただし、canで行うことは、同じコードが再トリガーしないように、べき等の方法で状態をマークすることにより、コードを保護します。例えば:

exports.doThing = functions.database.ref('/events/{id}').onWrite(ev => {
  // prevent loops by guarding on data state
  if (ev.data.child('didThingAt').exists()) return;

  // do thing here...

  return ev.data.adminRef.update({
    didThingAt: admin.database.ServerValue.TIMESTAMP
  });
});
19
Michael Bleigh

Firebase関数がより良い方法を提供することを理解しています:

方法は、以前のイベントが存在するかどうかを確認することです。もしそうなら、何もせずに他に戻ります、あなたは仕事をします...あなたはアイテムが削除されているかどうかを確認することができます。

  if (event.data.previous.exists()) {
    return;
  }
  // Exit when the data is deleted.
  if (!event.data.exists()) {
    return;
  }

これは firebase documentation の完全な例です。

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite(event => {
      // Only edit data when it is first created.
      if (event.data.previous.exists()) {
        return;
      }
      // Exit when the data is deleted.
      if (!event.data.exists()) {
        return;
      }
// Grab the current value of what was written to the Realtime Database.
const original = event.data.val();
console.log('Uppercasing', event.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the Realtime Database returns a Promise.
return event.data.ref.parent.child('uppercase').set(uppercase);
6
Juan Pablo