Angular Firestore批次和交易

时间:2018-02-18 15:40:14

标签: javascript angular firebase

我一直在努力研究这背后的理论几周并在互联网上进行检查,但找不到真正帮助我的任何东西,所以我第一次接触SO社区。

我在Firestore中有3个集合(用户,事件和事务)。添加新事件时,我需要:

  1. 将新文档添加到事件集合
  2. 更新用户文档中的余额。
  3. 将新文档添加到交易集合中,该集合需要使用上述2.中的新余额。
  4. 现在,这些都必须全部成功,或者如果其中任何一个失败,那么它们都必须失败它们必须按顺序完成(我不能在阶段中使用第2阶段的余额3在第2阶段完成之前!)这指向我的交易,但你不能在交易中执行和添加

      

    事务由任意数量的get()操作组成,后跟任意数量的写操作,如set(),update()或delete()。

    所以我调查了批次,但再次没有ADD允许

      

    如果您不需要读取操作集中的任何文档,则可以将多个写入操作作为包含set(),update()或delete()操作的任意组合的单个批处理执行。

    所以我有点困惑。

    我开始研究async / await但是,虽然这会等到上一个操作完成然后再转到下一个动作,但是不会允许我在发生错误时回滚(我们不会轻易!)

    我的应用程序是在Angular 4中,但任何Javascript帮助都将非常感谢.....

1 个答案:

答案 0 :(得分:0)

方法1:

一种可能的解决方案是Firebase触发器:

https://firebase.google.com/docs/functions/firestore-events

  • 事件onCreate触发更新用户文档的余额

  • 用户onUpdate触发器添加交易文档

这还提供了不需要回滚错误的额外好处。如果步骤1失败,则步骤2将不会运行,如果步骤2失败,则步骤3将不会运行。第2步有可能成功,第3步失败。

方法2:

set()函数与添加工作的方式类似。一个区别是您必须在设置特定文档上的数据之前设置文档ID。这样,您可以使用事务来更新和添加文档。如果您使用的是AngularFire2,示例将如下所示:

this.afs.doc('transactions/' + this.afs.createId()).set(transactionData);

您很可能希望使用上面提供的两种方法的组合,具体取决于用户应具有客户端的写访问级别。我推荐的解决方案是使用事件onCreate触发器,并在触发器内部有一个事务来更新用户并设置事务文档。