如何将 JS 日期对象传递给云函数以将其存储在 Firestore 上

Rau*_*aul 2 javascript date firebase google-cloud-functions google-cloud-firestore

当我将 Date 对象写入 Firestore 时,一切正常,我可以在数据库中看到以“时间戳”类型存储的日期。如果我尝试将 Date 对象传递给云函数,我不知道为什么,但是当我将它从云函数存储到 firestore 数据库时它是一个空对象。

  firebase.functions().httpsCallable("myFunction")({date: new Date()}) <---- // this doesn't work
Run Code Online (Sandbox Code Playgroud)

因此,我决定在将 Date 对象发送到云函数之前,将其转换为客户端的 firestore 时间戳。如下:

  date = firebase.firestore.Timestamp.fromDate(date);
  firebase.functions().httpsCallable("myFunction")({date})
Run Code Online (Sandbox Code Playgroud)

然后,如果我在云函数中获取它并将其存储在我的 firestore 中,我会看到一个带有“seconds”和“nanoseconds”字段的对象,但不是时间戳(我的意思是它不是以 Timestamp 类型存储的)。 . 所以当我得到这个日期时,我不能应用方法 .toDate()

在这种情况下,有没有什么好方法可以将日期存储为时间戳而不是对象?

Dou*_*son 5

可调用函数的输入和输出完全处理 JSON,因此它们仅限于表达 JSON 中允许的那些类型:字符串、数字、布尔值、空值、对象、数组。Date 和 Timestamp 不在这些类型中。Firebase SDK 将尝试将自定义对象序列化为 JSON,这并不像您想要的那样工作 - Timestamp 的 seconds 和 nanos 字段在序列化过程中被拆分。

如果您要从客户端发送日期,则应该将其作为数字发送。不是传递 Date 对象,而是传递其中的单个数字(自 unix 纪元以来的毫秒数):

const number = date.getTime()
Run Code Online (Sandbox Code Playgroud)

在接收方,在 Cloud Functions 中,获取数字并将其转换回日期:

const date = new Date(number)
Run Code Online (Sandbox Code Playgroud)

然后您可以将 Date 对象写入 Firestore 文档字段。