首页 > 解决方案 > 按服务器时间戳查询 Firestore

问题描述

是否可以使用服务器的时间戳过滤 Firestore 查询?尝试执行查询时,例如:

firebase.app.firestore()
  .collection('posts')
  .where('timestamp', '<=', firebase.firestore.FieldValue.serverTimestamp())

抛出以下错误。

FirebaseError: Function Query.where() called with invalid data. FieldValue.serverTimestamp() can only be used with update() and set()

我知道我可以使用new Date()而不是FieldValue.serverTimestamp(),但如果有一种方法可以使用受信任的服务器时间戳进行查询,那就太好了。我的用例是带有到期日期的折扣代码集合,其中到期日期保存为 Firestore 时间戳。如果用户更改他们的系统时间,如果我依赖客户端日期进行过滤,则此查询可能会返回无效(过期)结果。我正在使用 Firebase 函数来实际处理折扣(使用服务器时间戳很容易验证到期),因此系统时间不正确的用户仍然无法实际使用折扣代码。尽管如此,最好保证这样一个查询中的时间一开始就不会显示过期的代码。

标签: firebasegoogle-cloud-firestore

解决方案


FieldValue.serverTimestamp()是一个标志,而不是一个真正的值——它指示 FireeStore在写入操作期间使用当前服务器时间作为一个值。它不是一个真正的“价值”,你可以用它来代替“现在”。

您正在考虑(并想要使用)的是firebase.firestore.Timestamp.now(),(sp?)https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp,它使用纪元时间(补偿时区)。更改它们的本地时钟不会破坏这一点 - 正如您可能已经在其他地方注意到的那样,大多数浏览器和服务(包括 Firestore)需要本地时钟才能相当准确以维持操作。如果您的用户/黑客充分破解了他们的本地时钟以试图绕过您的规则,那么他们的 Firestore 服务将无法正常工作。


推荐阅读