firebase 当我写信给Firestore时,我怎么知道所有触发的都已经完成了?

ioekq8ef  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(109)

背景:我使用Firestore作为我的(Web)应用程序的主数据库。我还预渲染存储在那里的数据,这基本上意味着我收集特定请求所需的所有数据,以便稍后可以在单个读取访问中获取它们,并且我将预渲染的数据存储在单独的Firestore集合中。
当用户更改某些数据时,我想知道后台渲染何时完成,这样我就可以显示更新的数据。在渲染完成之前,我想显示一个加载指示器(“微调器”),这样用户就知道他当前查看的是过时的数据。
直到现在,我计划让应用程序将更改的数据写入数据库,并使用云函数将更改的数据传播到预渲染数据的集合中。这带来了一个问题,因为编写应用程序只知道原始写入访问何时完成,但不知道重新渲染何时完成,所以它不知道什么时候更新它的视图。我可以挂钩到渲染视图的表中,以便在渲染完成时获得更新,但是如果没有任何明显的变化,该回调不会得到通知,所以我仍然不知道什么时候删除微调器。
我的第二个想法是让renderer函数发布到一个pubsub主题,但这失败了,因为如果用户的请求碰巧没有改变原始数据,onUpdate/renderer就不会被调用,所以pubsub上什么都没有发布,客户端也不知道什么时候删除微调器。
在这两种情况下,理论上我都可以首先获取数据并查看是否发生了变化,但我觉得这太容易引入细微的bug。
我最后的想法是禁止直接写数据库,而让所有的写操作都通过云函数来执行,也就是说,更像是一个经典的后端。这些函数可以运行渲染器,只有当渲染器完成时才发送响应(或发布到pubsub)。但这有两个新问题:首先,这些函数对整个数据库具有完全的写访问权限,我回到了像传统后端一样手动检查用户的权限,无法使用Firestore的权限规则。其次,在这种方法中,渲染器不会像onUpdate那样自动获取之前/之后的快照,所以我又回到了在更新之前获取每条记录,这样渲染器就知道发生了什么变化,并且不会重新渲染数据库中实际上根本没有受到影响的大部分数据。
理想情况下,(我认为)我需要的是(1)一种方法来知道对数据库的写访问何时完成,包括onUpdate触发器,或者(2)一种方法来让onUpdate调用一个实际上没有更改数据库的写访问(所有更新的字段都被更新为它们已经包含的值)。
在Firestore / cloud函数中有什么方法可以做到这一点吗?

k5ifujac

k5ifujac1#

您可以在呈现的文档中增加一个计数器,这样即使“有意义”的字段没有变化,字段也总是变化的
因此,最好使用FieldValue.increment

相关问题