我在firebase中有serverTimestamp。
我创建了两个文档并对它们进行了测试。
一个是new Date()
,另一个则是admin.firestore.FieldValue.serverTimestamp ()
。
这存储了完全相同的值。
然而,为什么会有serverTimestamp
?
我不是指客户端(web(上的serverTimestamp
。
我指的是firebase函数使用的serverTimestamp
。
我什么时候该用这个?
如果您查看Timestamp的API文档(我链接到nodejs服务器SDK版本,该版本由nodejs Firebase Admin SDK使用(,您会发现它比JavaScript Date对象具有更大的粒度。时间戳记录的时间精度为纳秒,而Date仅使用毫秒精度。这就是Firestore在内部表示其时间戳的方式,并且精度会传递给具有这种新数据类型的客户端,该客户端不会丢失任何数据。
为什么这很重要?好吧,如果随着时间的推移,有很多文档进入一个集合,那么如果时间更精细,获得真正唯一的时间戳编号的几率就会增加。此外,如果Firestore使用纳秒精度,那么在执行分页等需要知道页面最后一项排序字段值的操作时,可能需要匹配该精度。如果您没有反馈一个适当精确的值,那么您的分页可能会不准确。
FieldValue.serverTimestamp()
特别重要,因为它在自己的服务器上使用了谷歌标准保证准确的时钟值。这使用了一种非常复杂的方法来处理有问题的时间戳,特别是处理闰秒。如果客户端试图用自己的时间感添加一个值,谁知道该客户端时钟值是否准确。它可能非常不准确,也许开发人员不希望这样。使用serverTimestamp()
告诉谷歌,当客户可能不在时,它应该使用自己的时钟时间感来准确
您可以更进一步,使用安全规则进行检查,以确保web或移动客户端在应该需要的字段值中提供了serverTimestamp()
令牌值,因此它不能伪造只需要真实当前时间戳的时间戳。安全规则语言允许您使用request.time与字段值进行比较,以确保基于时间的请求得到正确处理。
精度的差异可能会通过其他方式产生影响,但最重要的是客户端SDK需要与服务内部使用的内容相匹配。