Javascript Firestore时间戳属性在admin SDK中以下划线作为前缀,但在客户端SDK中不以下划线作为前缀

Javascript Firestore时间戳属性在admin SDK中以下划线作为前缀,但在客户端SDK中不以下划线作为前缀,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,当我使用Firestore Admin SDK加载并字符串化用户数据时,时间戳具有以下结构: { "_seconds": 1566129600, "_nanoseconds": 0 } { "seconds": 1566129600, "nanoseconds": 0 } 在客户机上加载和字符串化相同的数据时,我得到以下结构: { "_seconds": 1566129600, "_nanoseconds": 0 } { "seconds": 156612960

当我使用Firestore Admin SDK加载并字符串化用户数据时,时间戳具有以下结构:

{
  "_seconds": 1566129600,
  "_nanoseconds": 0
}
{
  "seconds": 1566129600,
  "nanoseconds": 0
}
在客户机上加载和字符串化相同的数据时,我得到以下结构:

{
  "_seconds": 1566129600,
  "_nanoseconds": 0
}
{
  "seconds": 1566129600,
  "nanoseconds": 0
}
这种差异有什么好的原因吗


我在前端和Node.js后端使用JavaScript。

您看到的是两个SDK中时间戳的实现细节。你真的不应该依赖这些细节。如果您想从JSON保存和加载时间戳对象,您应该使用其有文档记录的公共访问器读取时间组件(秒和纳秒)。然后,为了重新构造时间戳,将这些值传递到其构造函数中


如果Timestamp对象有一个toJSON函数,那么可以调用该函数来将对象序列化为JSON。但事实并非如此,而且你不能仅仅将主对象本身字符串化。您可以这样做。

只需创建一个新的时间戳类:

class Timestamp {
    constructor(seconds,nanoseconds) {
        this.seconds = seconds
        this.nanoseconds = nanoseconds
    }
}
那就叫它:

const newCustomTimestamp = new Timestamp(_dobSeconds, _nanoSeconds);

然后用我们创建的时间戳覆盖您当前的时间戳,Swift将正确解码密钥,以便您可以在客户机上使用。

“您不应该依赖这些细节。”我真希望我不必依赖,我真的需要。我在服务器上预加载集合。我根据时间戳订购集合。一切都很好。但是,如果我想基于
timestamp
属性进行分页(因为我无法在预加载时将整个
DocumentSnapshot
从服务器传递到客户端),我需要将timestamp转换为对象
{seconds,nanoseconds}
进行预加载,然后在使用光标进行查询时返回。我的转换器适用于这两个SDK,因此我需要检查有类似问题的任何其他人的下划线和非下划线键(?);我通过转换
时间戳
toMillis()
,将它从服务器传递到客户端,然后使用
fromMillis()
重新创建它来解决我的问题!