虚拟钱包的Firestore幂等性

时间:2019-02-21 15:02:48

标签: google-cloud-firestore

我再次向你们求助。我有一个应用程序,您可以在其中用信用卡充值自己的虚拟钱包。

我的结构如下:

  • 集合transactions/{transactionId}-包含所有者UID和充值金额。
  • 包含users/{userId}/personal/wallet的集合{ funds: 0 }

我将钱包保留在personal信息的子集合中,因为我不希望其他用户看到它。

无论如何,对于onCreate集合下的新文档,我有一个walletSync触发器,称为transactions,我从中提取该金额并将其通过{{1}添加到用户的当前资金中}。

问题是,该功能有时会为一个文档触发3次...。这是屏幕截图。我已经记录了transactionId(这只是一个文档),正如您所看到的,onCreate被处理了3次,因此,用我的实际值的3倍充值我的钱包。

这是我的功能代码,在其中我用runTransaction标记任何已处理的事务,因此下次触发时可以忽略它。正如您在日志中看到的那样,processed: true消息从不弹出,这意味着触发器在下次触发时不会获取新数据。

我在这里没主意,请指教。

编辑:这是我的功能:https://pastebin.com/PRA7CbxL

enter image description here

1 个答案:

答案 0 :(得分:0)

借助强大的@Doug和提到的类似问题,我设法弄清楚了。

毕竟,我代码的问题在于,当我将事务标记为processed时,我假设函数第二次/第三次触发时,snapshot.data()将是文档(花了我一些时间才意识到)实际上是向数据库触发器发送的change数据。我知道这听起来很混乱,但是该函数并未发送文档的值(为此,您可以获取snapshot.ref并从那里获取数据,以便在事务中获取更新的值)。

所以这是我在Pastebin上更新的功能。这是运行中的代码的屏幕截图:https://i.imgur.com/fbQSGT6.png