我一直在努力研究这背后的理论几周并在互联网上进行检查,但找不到真正帮助我的任何东西,所以我第一次接触SO社区。 p >
我在Firestore中有3个集合(用户,事件和事务)。添加新事件时,我需要:
现在,这些都必须全部成功,或者如果其中任何一个失败,那么它们都必须失败和它们必须按顺序完成(我不能在阶段中使用第2阶段的余额3在第2阶段完成之前!)这指向我的交易,但你不能在交易中执行和添加
事务由任意数量的get()操作组成,后跟任意数量的写操作,如set(),update()或delete()。
所以我调查了批次,但再次没有ADD允许
如果您不需要读取操作集中的任何文档,则可以将多个写入操作作为包含set(),update()或delete()操作的任意组合的单个批处理执行。
所以我有点困惑。
我开始研究async / await但是,虽然这会等到上一个操作完成然后再转到下一个动作,但是不会允许我在发生错误时回滚(我们不会轻易!)
我的应用程序是在Angular 4中,但任何Javascript帮助都将非常感谢.....
答案 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触发器,并在触发器内部有一个事务来更新用户并设置事务文档。