将快照中所有Firestore时间戳覆盖到JS日期的方法?

问题描述

您如何编写一种将快照中的 全部 Firestore时间戳转换为JavaScript日期的方法

例如,来自posts集合的快照可能会返回几个Firestore时间戳(createdDtTmmodifyDtTm):

[
  { 
    text: 'My new post', 
    uid: 'nzjNp3Q', 
    createDtTm: Timestamp { seconds: 1596239999,nanoseconds: 999000000 },modifyDtTm: Timestamp { seconds: 1596239999,  
  },{ 
    text: 'Another post',    modifyDtTm: Timestamp { seconds: 1596239999,]

通过在数组上映射并为每个时间戳使用toDate()方法(例如createDtTm.toDate()),转换单个日期非常简单

但是,在不显式指定Timestamp字段的情况下,转换这两个(或任意任意数量的)Firestore时间戳的更通用的方法是什么?

例如,Firestore时间戳记是否具有可用于识别的唯一类型?是否需要假设命名约定(例如,字段名称包含DtTm)?其他吗?

先前的问题回答了如何转换single Timestampmultiple documents in a snapshot中的单个时间戳。但是,当存在多个时间戳时,我还没有找到一种通用的方法来转换快照中的所有时间戳。更具体地说,我对在React Provider中使用的方法感兴趣,该方法会将JavaScript日期(不是Firestore时间戳)传递给Consumers,同时也没有创建每次更新Provider的依赖项新的“时间戳记”字段将添加到数据模型/集合中。

解决方法

我认为没有任何全局方法,但是我认为创建一个可以分析快照并对其进行更改的函数很容易。这不是很复杂。在node.js中,我这样做是这样的:

function globalToData (snapshot) {
      for (const field in snapshot)
  
    if (snapshot[field] instanceof Firestore.Timestamp) { 
        snapshot[field] = snapshot[field].toDate()
    }
    else if (snapshot[field] instanceof Object) { 
        globalToData (snapshot[field]);
    }
    return snapshot;
}; 

如果您获得DocumentSnapshot作为前任。捕捉,你可以这样称呼它:

globalToData(snap.data())

这应该转换所有级别的文档快照中的所有时间戳(我测试到嵌套混合图和数组的第三级)。我们没有您的解决方案,但是您可以在应用程序的中间位置实现它。