Firebase 在哪些情况下,我可以获得具有Firestore serverTimestamp且未';还没定下来吗?
我刚刚在Firebase 在哪些情况下,我可以获得具有Firestore serverTimestamp且未';还没定下来吗?,firebase,google-cloud-firestore,timestamp,google-cloud-functions,Firebase,Google Cloud Firestore,Timestamp,Google Cloud Functions,我刚刚在firebase.firestore.SnapshotOptions上遇到了这段视频: 服务器时间戳 serverTimestamps:“估计”|“先前”|“无” 如果设置,则控制尚未设置为最终值的服务器时间戳的返回值。 通过指定“估计值”,挂起的服务器时间戳返回基于本地时钟的估计值。此估计值将与最终值不同,并导致这些值在服务器结果可用后发生更改 通过指定'previous',将忽略挂起的时间戳,并返回其先前的值 如果省略或设置为'none',默认情况下将返回null,直到服务器值变为可
firebase.firestore.SnapshotOptions
上遇到了这段视频:
服务器时间戳
serverTimestamps:“估计”|“先前”|“无”
如果设置,则控制尚未设置为最终值的服务器时间戳的返回值。
通过指定“估计值”
,挂起的服务器时间戳返回基于本地时钟的估计值。此估计值将与最终值不同,并导致这些值在服务器结果可用后发生更改
通过指定'previous'
,将忽略挂起的时间戳,并返回其先前的值
如果省略或设置为'none'
,默认情况下将返回null
,直到服务器值变为可用
这让我很担心,因为我正试图将客户端生成的日期转换为服务器时间戳。我想,每当我读到一个用serverTimestamp()
保存的文档快照时,我都会100%地认为在该点上会设置一个日期。但从上面的文档来看,我似乎无法做出这样的假设
作为一般问题:
在哪些情况下,我可以找到尚未设置的serverTimestamp
?是否有一个常见的用例会成为一个问题
具体而言,我想了解这两个案例:
案例1
- 使用字段
createdAt:firebase.firestore.FieldValue.serveTimestamp()将文档保存到firestore
- 我有一个云函数,该函数带有特定集合的firestore
触发器onWrite | onUpdate
createdAt:serverTimestamp
案例2
- 使用字段
createdAt:firebase.firestore.FieldValue.serveTimestamp()将文档保存到firestore
- 在客户端上,我有一个侦听器,用于我刚刚保存/更新的
doc
docSnapshot
数据激发时,是否有可能尚未设置createdAt:serverTimestamp
更新 刚找到这篇文章 对于情况2,这似乎只会发生在本地写入。考虑到这一事实,在案例1中,由于它不是本地写入,因此在侦听firestore触发器的云函数上永远不会发生这种情况,这安全吗 应用程序中的本地写入将立即调用快照侦听器。这是因为有一个叫做“延迟补偿”的重要特性。当您执行写操作时,在将数据发送到后端之前,您的侦听器将收到新数据的通知 检索到的文档具有metadata.hasPendingWrites属性,该属性指示文档是否具有尚未写入后端的本地更改。您可以使用此属性确定快照侦听器接收的事件源 当该侦听器使用新的docSnapshot数据激发时,是否有可能尚未设置createdAt:serverTimestamp
这正是你所能期待的。由于只能在服务器上设置服务器时间戳,因此必须等待来自服务器的快照。写入时从活动侦听器获取的第一个快照将不包含最终的时间戳值。能否在此线程中添加对此问题找到的答案作为答案?这对Stackoverflow社区很有用。关于您关于案例1的问题,我相信您的猜测是正确的,但是如果您也可以发布一个snipet,以便其他成员可以尝试它,这将是有益的。@ikerlasaga感谢您的回答。我只是想看看在Firebase有更多经验的人能否写出更详细的答案,并确认我的猜测是否属实。谢谢,道格。无论何时从服务器发送快照,都可以100%保证时间戳已设置,对吗?因此,案例1中的云函数将始终获得适当的时间戳,因为它是直接从服务器调用的。这是正确的吗?除非写操作以某种方式失败。Firestore不能保证所有写入都成功。