首页 > 解决方案 > 当想要比较更新的时间戳时,如何解决 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 } }

底线是,如果需要依赖不可变的服务器端时间戳,请记住这一点,或者解决它

标签: node.jsfirebasefirebase-realtime-database

解决方案


当您执行ref.push({timestamp: timestamp})Firebase客户端时,会立即估计客户端上的时间戳并在本地触发一个事件。然后它将命令发送到服务器。

Firebase 客户端收到来自服务器的响应后,它会检查实际时间戳是否与其估计值不同。如果确实不同,则客户端会触发和解事件。

通过在设置值之前附加您的value侦听器,您可以最轻松地看到这一点。您会看到它以初始估计值和来自服务器的最终值触发。

另见:


推荐阅读