node.js - 当想要比较更新的时间戳时,如何解决 Firebase 实时数据库的服务器端时间戳波动?
问题描述
在阅读 上的文档后ServerValue.TIMESTAMP
,我的印象是,一旦对象命中数据库,时间戳占位符就会评估一次并且保持不变,但对我来说并非如此:
// Example on Node:
> const db = f.FIREBASE_APP.database();
> const timestamp = f.FIREBASE_APP.database.ServerValue.TIMESTAMP;
> const ref = db.ref('/test');
> ref.on(
... 'child_added',
... function(snapshot) {
..... console.log(`Timestamp from listener: ${snapshot.val().timestamp}`);
..... }
... )
> var child_key = "";
> ref.push({timestamp: timestamp}).then(
... function(thenable_ref) {
..... child_key = thenable_ref.key;
..... }
... );
Timestamp from listener: 1534373384299
> ref.child(child_key).once('value').then(
... function(snapshot) {
..... console.log(`Timestamp after querying: ${snapshot.val().timestamp}`);
..... }
... );
> Timestamp after querying: 1534373384381
> 1534373384299 < 1534373384381
true
从on
侦听器查询时时间戳不同,以后查询时时间戳不同。
这是设计使然,我只是错过了文档的某些部分吗?如果是这种情况,何时ServerValue.TIMESTAMP
稳定?
我正在实时数据库上构建一个 CQRS/ES 库,只是想避免expected_version
事件(或序列号)。
更新
弗兰克解释的证明如下:
/* `db`, `ref` and `timestamp` are defined above,
and the test path ("/test") has been deleted
from DB beforehand to avoid noise.
*/
> ref.on(
... 'child_added',
... function(snapshot) {
..... console.log(`Timestamp from listener: ${snapshot.val().timestamp}`);
..... }
... )
> ref.on(
... 'value',
... function(snapshot) {
..... console.log(snapshot.val());
..... }
... )
> ref.push({timestamp: timestamp}); null;
Timestamp from listener: 1534434409034
{ '-LK2Pjd8FS_L8hKqIpiE': { timestamp: 1534434409034 } }
{ '-LK2Pjd8FS_L8hKqIpiE': { timestamp: 1534434409114 } }
底线是,如果需要依赖不可变的服务器端时间戳,请记住这一点,或者解决它。
解决方案
当您执行ref.push({timestamp: timestamp})
Firebase客户端时,会立即估计客户端上的时间戳并在本地触发一个事件。然后它将命令发送到服务器。
Firebase 客户端收到来自服务器的响应后,它会检查实际时间戳是否与其估计值不同。如果确实不同,则客户端会触发和解事件。
通过在设置值之前附加您的value
侦听器,您可以最轻松地看到这一点。您会看到它以初始估计值和来自服务器的最终值触发。
另见:
推荐阅读
- database - 如何有效地从 DynamoDB 中检索海量数据?
- ios - 当应用程序通过推送通知从终止状态打开时,iOS Web 视图应用程序崩溃
- angular - 带有 aria-live 的可访问性 Angular5
- r - 2d 绘图为空(第三个变量中的 2 行和线条颜色)
- php - Behat 脚本无法检测到 CKEditor 工具栏元素
- google-cloud-platform - GCP 虚拟机实例 - 操作系统以其他用户身份登录
- html - 如何使这个左侧边栏在移动设备上可见?
- firebase - 如何获取云函数onCreate触发器文档ID
- android - Flutter 应用程序在启动时崩溃,log-cat 中没有错误接受一些警告
- antd - 关于“antd 在移动端无法正常运行”的澄清