代码之家  ›  专栏  ›  技术社区  ›  João Victor

云函数和具有幂等性的Firebase Firestore

  •  6
  • João Victor  · 技术社区  · 6 年前

    我正在使用Firestore的beta版和云功能。在我的应用程序中,我需要触发一个函数来侦听 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 回复  |  直到 6 年前
        1
  •  10
  •   Doug Stevenson    6 年前

    有两件事:

    1. 首先检查集合,查看文档是否具有值为的属性 context.eventId 在里面。如果存在,则不在函数中执行任何操作。
    2. 如果事件id为的文档不存在,请将 上下文事件ID 在您添加的文档中的属性中。

    这应该可以防止函数的多次调用为给定的事件id添加多个文档。

        2
  •  3
  •   brabster    6 年前

    为什么不呢? set 文档(根据上下文中的事件id进行索引)而不是创建文档?这样,如果您写两次,您只需覆盖而不是创建新记录。

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

    这种方法使得写操作是幂等的。