web-dev-qa-db-fra.com

Fonctions cloud pour Firebase OnWrite

Je regarde les nouvelles fonctions cloud pour Firebase et il est dit que lorsque vous effectuez une opération OnWrite, vous devez faire attention de ne pas sauvegarder les données sur le même enfant. (qui déclenchera à nouveau la détente).

J'essaie donc de comprendre, comment puis-je définir une date de modification sur un enregistrement?

16
Mark

Le problème n'est pas que vous ne pouvez pas ou ne devez pas modifier les données, mais que vous devez vous prémunir contre les boucles infinies. Par exemple, définir un horodatage pourrait redéclencher la fonction qui définirait l'horodatage qui redéclencherait ... et ainsi de suite.

Ce que vous pouvez faire, cependant, c'est protéger votre code en vous assurant de marquer l'état de manière idempotente afin que le même code ne se redéclenche pas. Par exemple:

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

Je comprends que les fonctions Firebase fournissent une meilleure méthode:

La méthode consiste à vérifier si un événement précédent existe. Si c'est le cas, ne faites rien et revenez ailleurs, travaillez-vous ... En plus, vous pouvez vérifier si l'élément est en cours de suppression.

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

Ceci est un exemple complet de documentation Firebase .

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