Firestore时间戳和Google Cloud函数存在问题(date.toDate()不是函数)



我正在云函数中获取一个日期(来自firestore(,然后将其返回到客户端。

这是结果日期对象:

Object {
"_nanoseconds": 1607618708,
"_seconds": 615000000,
} // I know how to convert this to a javascript date object, but I need the .toDate()

然后,在前端,如果我执行date.toDate((,我会得到错误";。toDate不是一个函数

另一方面,如果我直接从客户那里得到相同的日期,一切都很完美。。。(.toDate((是一个函数(

这是结果日期对象:

t {
"nanoseconds": 1607618708,
"seconds": 615000000,
}

这里发生了什么?我该如何解决这个问题?

更新

->不起作用的代码:

// Cloud Function
var userData = await firebase.getUserData(userId); // userRef.get().then(doc => ... return doc.data());
console.log(userData.birthday);
/*
Timestamp {
_seconds: 1038832012,
_nanoseconds: 14000000 
}
*/

return { userData }
// Client side
firebase.functions.httpsCallable(...)(...).then(res => {
console.log(res.data.userData.birthday);
/*
Object {
"_nanoseconds": 1607618708,
"_seconds": 615000000,
}
new Date(date._seconds * 1000) will work but I need to execute .toDate()
*/
const birthday = res.data.userData.birthday.toDate();
// ERROR: .toDate is undefined
})...

->工作代码(无服务器端(:

// Client side 
const userData = await userRef.get().then((doc) => ... return doc.data());
console.log(userData.birthday);
/*
t {
"nanoseconds": 1607618708,
"seconds": 615000000,
} 
*/
const birthday = userData.birthday.toDate(); // WORKS GOOD

谢谢。

可调用函数仅将对象序列化为JSON。当SDK序列化一个时间戳时,它只获取它的字段并从中构造一个新的JSON对象。该对象没有正式类型。它只是一个普通的对象,在对象内部有两个数据字段——秒和纳秒。

客户端将接收带有两个字段的JSON,但不一定知道它来自时间戳。您必须在客户端应用程序上编写代码,才能将带有秒和纳米的JSON对象转换回时间戳(如果它想要使用的话(。一旦你有了秒和纳米,你就可以简单地用它的构造函数(new Timestamp(seconds, nanos)(创建一个新的时间戳。然后您可以在该时间戳上调用toDate()。这真的没有捷径可走,除非你自己养活自己。

您可以尝试:

if(userData.birthday.toString.contains('_seconds'){
return Timestamp(userData.birthday['_seconds'], userData.birthday['_nanoseconds']);
}else{
return Timestamp(userData.birthday);
}

最新更新