Облачные функции для Firebase OnWrite

Я смотрю Новые функции облаков для Firebase, и он говорит, что при выполнении OnWrite вы должны быть осторожны, чтобы не сохранять данные назад к одному и тому же ребенку. (который снова отключит триггер).

Итак, я пытаюсь выяснить, как установить дату изменения в записи?

Ответы

Ответ 1

Проблема не в том, что вы не можете или не должны изменять данные, но вам нужно защищать от бесконечных циклов. Например, установка метки времени может перезапускать функцию, которая устанавливает временную метку, которая будет перезапускать... и т.д.

Однако вы можете защитить свой код, убедившись, что он помечает состояние идемпотентным способом, чтобы тот же код не перезапускал. Например:

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
  });
});

Ответ 2

Я понимаю, что функции firebase обеспечивают лучший метод:

Метод должен проверить, существует ли предыдущее событие. Если да, ничего не делайте и возвращайтесь еще, работаете ли вы... Кроме того, вы можете проверить, удаляется ли элемент.

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

Это полный пример из документации 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);