使用Firebase的服务器时间戳记

时间:2020-01-16 17:14:17

标签: javascript firebase timestamp

我正在研究一个评论/评论流程,并且希望能够将用户为另一个评论/评论所提供的每个评论/评论存储在Firebase中,并且同时给出的每个评论/评论都在同一时间戳下。我最初使用的是JS函数new Date()。getTime(),它可以正常工作,但是为了确保用户无法篡改值(即通过更改计算机上的日期),我想使用Firebase时间戳代替。

现在,我希望最终产品成为地图:

[chatStartTime] : {
   review : stars,
   time : chatStartTime
 }

然后我使用transaction.set()将其合并到firebase文档中。现在的问题是ChatStartTime,它应该代表此时间戳。我有代码:

var chatStartTime = firebase.firestore.FieldValue.serverTimestamp();

顺便说一句,我也希望得到:

var chatStartTimeDate = chatStartTime.toDate();

但是chatStartTimeDate会导致错误-我的理解是这是因为chatStartTime本质上是“无效”的,直到将其添加到文档中为止。有什么办法可以解决这个问题并使用此功能?另外,如果我只对两个实例都使用chatStartTime,那么最终会在数据库上以以下形式映射:

[object Object] 
  review : 4.5
  time :
        .sv: "timestamp"

.sv是字符串类型。我该如何解决这个问题?我希望最终结果看起来像(例如)

 1579194722735
  review : 4.5
  time : 1579194722735

1 个答案:

答案 0 :(得分:0)

在写入时将FieldValue.serverTimestamp()值写入服务器。因此,您无法在写入发生之前得到它。但是,您可以从响应中获取writeTime。这应该给您您所追求的。或者,您可以在编写文档后将其读回以获取时间戳(但这似乎没有必要)。

myCollection
    .doc('foo')
    .create({ timestamp: FirebaseFirestore.FieldValue.serverTimestamp() })
    .then(result => {
      const serverTime: Date = result.writeTime.toDate();
    });