【问题标题】:Can I trust the order of the Cloud Firestore triggers?我可以信任 Cloud Firestore 触发器的顺序吗?
【发布时间】:2019-01-16 17:37:32
【问题描述】:

我正在尝试调试与 Cloud Firestore 一起使用的 Firebase Cloud Functions 设置的一些奇怪问题。我正在向 Cloud Firestore 写入一些数据,并在 Cloud Functions 中内置了一些触发器。当我查看日志时,似乎有时 onCreate 触发器在 onUpdate 触发器之后运行。

来自documentation 我读到“与所有后台函数一样,不能保证事件顺序。”

所以根据我的理解,这真的会发生吗?我只是想确保这会在我的设置中发生很大变化。

例如,如果我需要在更新或创建文档时更新其他文档,如果更新未按正确顺序运行,我如何确保写入最新数据。我通常使用 change.after.data() 中的数据,但我能看到的唯一其他解决方案是每次都读取数据以确保拥有最新的数据。

那么两个问题:

  1. 我可以相信我的触发器以相同的顺序发生吗?
  2. 如果不是,我该如何解决这个问题?

感谢您的解释和帮助!

【问题讨论】:

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


    【解决方案1】:

    正如文档所述:无法保证解决触发器的顺序。

    处理这个问题的最佳方法是确保您的所有操作都是幂等的。 IE。多次或以不同的顺序运行相同的操作会导致相同的结果。这是我个人更喜欢使用onWrite 触发器而不是onCreateonUpdate 等的原因之一,因为它们使我更容易编写执行相同操作的代码所有情况。

    因此,在您的代码中,您将检查目标文档是否已经存在。如果是,请阅读目标文档。如果没有,请创建对新文档的引用。接下来,您将检查目标文档是否包含您想要的数据。如果是这样,什么也不做。如果没有,则根据源文档生成数据,并将其写入 Firestore。

    【讨论】:

    • 谢谢!开始重构我的代码以遵循您的指导方针
    【解决方案2】:

    实时数据库和 Firestore 都可以使用时间戳命令,以便在 .create.update 出现的那一刻,它被加上时间戳。因此,您的云函数似乎可以查看时间戳以确定最新值是什么。

    .firebase.database.ServerValue.TIMESTAMP;
    .firebase.firestore.FieldValue.serverTimestamp()
    

    【讨论】:

    • 如果可以在 Firebase 的触发器中实现这样的事情,我会很棒;创建事件时带有时间戳的一些元数据。
    • 突变事件上的DocumentSnapshot 有一个updateTimereadTimecreateTime。您可以将此与您上次在逻辑中处理记录以进行比较的时间进行比较。
    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 2011-03-20
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多