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不能保证所有写入都成功。