Облачные функции и Firebase Firestore с идемпотентностью - PullRequest
0 голосов
/ 26 апреля 2018

Я использую Firestore в бета-версии с Cloud Functions. В моем приложении мне нужно вызвать функцию, которая прослушивает событие onCreate в /company/{id}/point/{id} и выполняет вставку (collection('event').add({...}))

Моя проблема: облачные функции с Firestore требуют идемпотентной функции. Я не знаю, как гарантировать, что если моя функция сработает два раза подряд с одним и тем же событием, я не добавлю два документа с одинаковыми данными.

Я обнаружил, что context.eventId может решить эту проблему, но я не знаю, как его использовать.

exports.creatingEvents = functions.firestore
  .document('/companies/{companyId}/points/{pointId}')
  .onCreate((snap, context) => {

    //some logic...

    return db.doc(`eventlog/${context.params.companyId}`).collection('events').add(data)
})

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Почему бы не set документ (индексировать по идентификатору события из вашего контекста) вместо его создания? Таким образом, если вы напишите это дважды, вы просто перезапишете, а не создадите новую запись.

https://firebase.google.com/docs/firestore/manage-data/add-data

Этот подход делает операцию записи идемпотентной.

0 голосов
/ 26 апреля 2018

Две вещи:

  1. Сначала проверьте свою коллекцию, чтобы увидеть, есть ли в документе свойство со значением context.eventId. Если он существует, ничего не делайте в функции.
  2. Если документ с идентификатором события еще не существует, укажите значение context.eventId в свойстве добавляемого документа.

Это должно помешать нескольким вызовам функции добавлять более одного документа для данного идентификатора события.

...