我再次向你们求助。我有一个应用程序,您可以在其中用信用卡充值自己的虚拟钱包。
我的结构如下:
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
答案 0 :(得分:0)
借助强大的@Doug和提到的类似问题,我设法弄清楚了。
毕竟,我代码的问题在于,当我将事务标记为processed
时,我假设函数第二次/第三次触发时,snapshot.data()
将是文档(花了我一些时间才意识到)实际上是向数据库触发器发送的change
数据。我知道这听起来很混乱,但是该函数并未发送文档的值(为此,您可以获取snapshot.ref
并从那里获取数据,以便在事务中获取更新的值)。>
所以这是我在Pastebin上更新的功能。这是运行中的代码的屏幕截图:https://i.imgur.com/fbQSGT6.png