firebase - 按服务器时间戳查询 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 函数来实际处理折扣(使用服务器时间戳很容易验证到期),因此系统时间不正确的用户仍然无法实际使用折扣代码。尽管如此,最好保证这样一个查询中的时间一开始就不会显示过期的代码。
解决方案
FieldValue.serverTimestamp()
是一个标志,而不是一个真正的值——它指示 FireeStore在写入操作期间使用当前服务器时间作为一个值。它不是一个真正的“价值”,你可以用它来代替“现在”。
您正在考虑(并想要使用)的是firebase.firestore.Timestamp.now()
,(sp?)https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp,它使用纪元时间(补偿时区)。更改它们的本地时钟不会破坏这一点 - 正如您可能已经在其他地方注意到的那样,大多数浏览器和服务(包括 Firestore)需要本地时钟才能相当准确以维持操作。如果您的用户/黑客充分破解了他们的本地时钟以试图绕过您的规则,那么他们的 Firestore 服务将无法正常工作。
推荐阅读
- javascript - 在窗口缩小 NUXT.js/Vue.js 内容后添加空格
- react-native - React Native 如何做出完整的 Comment 功能?
- python - Tensorflow 在终端上运行,但没有使用我的代码编辑器
- go - 等待 exec.Cmd 返回或接收来自频道 go 的消息
- time - 时区
- python - 计算商品是否在 24 小时内售出
- python - 如何在python中执行多个子字符串的就地替换
- amazon-web-services - 如何使用多个 lambda 函数的代码创建单个存储库?
- android - 如何在 Android 中插入两张图像并创建一张图像?
- javascript - 故事书不渲染组件