【问题标题】:Question regarding generating consistent dates inside of a Firebase Cloud Function关于在 Firebase 云函数中生成一致日期的问题
【发布时间】:2020-01-03 03:09:37
【问题描述】:

Firebase 提供以下两种我知道的方法,用于在将文档写入 Firestore 集合时处理日期:

以下将生成一个当前时间戳,我假设它代表所有地区的一致日期,格式在其documentation 中注明,并且是在文档写入时获取当前日期的推荐方法收藏:

admin.firestore.FieldValue.serverTimestamp()

还有以下方法可以接受日期作为参数。这将生成与相同 Firestore 时间戳格式匹配的结果:

admin.firestore.Timestamp.fromDate(new Date())

我一直在考虑在我的特定情况下使用后者作为生成日期的方法,我可以使用该日期将匹配日期写入 Firestore 集合中的文档以及额外单独插入到我的实时数据库中.我需要保证将完全相同的日期写入两个地方。

我在云功能中正在做什么:

const datePosted = new Date();
// then when setting the data in Firestore i do the following to convert it
admin.firestore().collection(`/posts`).doc().set({
  foo: 'bar',
  datePosted: admin.firestore.Timestamp.fromDate(datePosted)
})
// followed by a subsequent write to my Realtime database using the same date
admin.database().ref(`posts`).set({
  foo: 'bar',
  datePosted: Date.parse(datePosted)
})

谁能提供任何关于这种方法是否是一个坏主意的见解?我需要确定以我描述的方式生成日期是否是一种有效的方法,或者它是否不可靠,因为我的文档中生成的日期可能会因我的云实例何时和/或哪个区域而异函数被实例化。 我正在回避云函数在不同区域或出于任何其他原因进行实例化所需的不同时间。

【问题讨论】:

  • 如果你真的想拥有完全相同的时间戳值(“我需要保证将完全相同的日期写入两个地方”),你可以先写入 Firestore(使用 serverTimestamp),阅读文档获取值并使用该值写入 RTDB。当然,这意味着额外的阅读......
  • 是的,感谢您抽出宝贵时间回复。我希望避免这种情况,更不用说所涉及的延迟......但我暂时通过 onCreate 侦听器方法访问日期,并希望一起重构以避免在两个地方需要日期。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

admin.firestore.FieldValue.serverTimestamp() 生成一个保证准确的时间戳,正如 Google 所估计的那样。实际时间将在请求到达 Firestore 时解析,即使请求由于某种原因(例如离线)延迟也是如此。

admin.firestore.Timestamp.fromDate(new Date()) 生成一个时间戳,它使用用户设备计算的当前时间。 无法保证用户的设备设置了准确的时间。仅当您想知道用户设备上的时钟时间时才使用此选项,即使它不准确。

这取决于你。如果您希望在请求到达服务器时保证准确的时间,请使用服务器时间戳。如果您想要客户的时间推算,请使用new Date()

【讨论】:

  • 谢谢。对我来说,最重要的是 Firestore 和实时数据库中的匹配日期,所以如果时间相差几秒钟,我可以接受,但时间戳需要在两个文档中匹配。当您说“客户的时间计算”时……我是在云功能中生成日期,而不是在客户端……我担心的是不同地区是否会因此而有很大差异。
  • 地区根本不重要,因为时间戳中没有时区编码。它们只是对自 unix 纪元以来的秒数和毫秒数进行编码,这在世界各地都是一样的。
  • 明白了……不过,我并没有在这里清楚地表达自己。按地区,我正在逃避启动云功能的性能。说白了...假设用户触发了云功能,该功能恰好快速启动并在某个时间点生成写入...当另一个用户触发了该云功能的完全独立实例时,例如 6 秒前在开始时延迟了大约 6 秒...我假设在这种情况下,潜在写入会以最近的日期发布到数据库。
  • 时间戳将在new Date()行代码执行的那一刻生成。它不是基于函数被触发的时间。因此,如果从函数开始到该行代码需要 6 秒,那么它会看到从该时间开始的 6 秒延迟。 IMO,在实践中,除非您知道要投入该领域的非常具体的时间,否则最好占用服务器时间。不能硬保证时间戳是唯一的。我会说它可能是独一无二的,但不能保证。
猜你喜欢
  • 2021-06-21
  • 2020-08-21
  • 2017-12-08
  • 2021-04-03
  • 2020-01-30
  • 1970-01-01
  • 2019-05-10
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多