代码之家  ›  专栏  ›  技术社区  ›  Martin

我能相信云Firestore触发器的顺序吗?

  •  1
  • Martin  · 技术社区  · 6 年前

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

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

    所以据我所知这是真的吗?我只想确保这会改变我的设置很多。

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

    所以有两个问题:

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

    谢谢你的解释和帮助!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Frank van Puffelen    6 年前

    正如文档中已经提到的:不能保证触发器的解析顺序。

    处理这个问题的最好方法是确保所有操作都是等幂的。一、 e.多次或以不同的顺序运行同一操作,得到相同的结果。这是我个人的原因之一 更喜欢 使用 onWrite 触发器,结束 onCreate , onUpdate 等等,因为它们使我更容易编写在所有情况下执行相同操作的代码。

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

        2
  •  0
  •   Ronnie Smith    6 年前

    实时数据库和Firestore都可以使用timestamp命令,以便在 .create .update 发生,时间戳为。因此,您的云函数似乎可以查看时间戳来确定最新的值。

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