具有幂等性的云功能和Firebase Firestore

时间:2018-04-26 16:16:28

标签: firebase google-cloud-firestore google-cloud-functions idempotent

我正在使用带有云功能的测试版Firestore。在我的应用中,我需要触发一个在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 :(得分:6)

两件事:

  1. 首先检查您的收藏集,看看文档中是否包含值为 app.use(express.static(`${__dirname}/public`)) 的属性。如果存在,请在该功能中不执行任何操作。
  2. 如果具有事件ID的文档尚不存在,请将context.eventId的值放在您添加的文档中的属性中。
  3. 这可以防止多次调用函数为给定的事件id添加多个文档。

答案 1 :(得分:3)

为什么不set文档(通过上下文中的事件ID索引)而不是创建它?这样,如果你写两次,你只会覆盖而不是创建新记录。

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

这种方法使写操作具有幂等性。