gpt4 book ai didi

javascript - 在云可调用函数中返回日期/服务器时间戳

转载 作者:行者123 更新时间:2023-11-30 09:18:14 25 4
gpt4 key购买 nike

我正在使用客户端应用程序中的可调用函数从 firestore 中检索一些数据。数据是使用以下方法创建的:

projectData = {
created: firebase.firestore.FieldValue.serverTimestamp(),
...otherData
}
firebase.firestore().collection(projectsCollection).add(projectData)

而且我可以看到时间戳已正确保存在 firestore 控制台中。可调用函数还做了一些其他的事情并且有错误处理,但是数据检索是这样完成的(使用lodash将每个文档扩展成一个对象返回给客户端):

const projectRef = firestore.collection(gProjectsCollection).orderBy('created')
return projectRef.get().then(snapshot => {
return {
projects: _.chain(snapshot.docs)
.keyBy('id')
.mapValues(s => s.data())
.value()
}
})

这主要是可行的,但返回的对象有一个损坏的 created 属性(此处显示在函数 shell 输出中):

RESPONSE RECEIVED FROM FUNCTION: 200, {
"result": {
"projects": {
"XcRyQyaxLguRdbNmxQdn": {
"name": "c",
"description": "c",
"created": {
"_seconds": 1543405587,
"_nanoseconds": 169000000
}
}
}
}
}

我假设这是因为可调用函数在内部使用 JSON.stringify(),并且服务器时间戳未正确转换。我尝试将时间戳显式转换为这样的日期:

return projectRef.get().then(snapshot => {
return {
exVersion,
exId,
projects: _.chain(snapshot.docs)
.keyBy('id')
.mapValues(s => s.data())
.forEach(d => { d.created = d.created.toDate() })
.value()
}
})

但现在我得到一个空对象:

RESPONSE RECEIVED FROM FUNCTION: 200, {
"result": {
"projects": {
"XcRyQyaxLguRdbNmxQdn": {
"name": "c",
"description": "c",
"created": {}
}
}
}
}

我怀疑这里真正的问题是可调用函数没有设置为返回日期对象。如果我再一步将时间戳转换成一个字符串,我最终会在客户端得到一些东西:

return projectRef.get().then(snapshot => {
return {
exVersion,
exId,
projects: _.chain(snapshot.docs)
.keyBy('id')
.mapValues(s => s.data())
.forEach(d => { d.created = d.created.toDate().toISOString() })
.value()
}
})

给出:

RESPONSE RECEIVED FROM FUNCTION: 200, {
"result": {
"exVersion": 9,
"exId": null,
"projects": {
"XcRyQyaxLguRdbNmxQdn": {
"name": "c",
"description": "c",
"created": "2018-11-28T11:46:27.169Z"
}
}
}
}

我在文档中找不到有关日期特殊处理的可调用函数的任何内容,但我是否遗漏了一些应该如何完成的内容?


对可调用函数的一些进一步分析表明涉及 JSON.stringify(),但这不是全部问题:

console.log(JSON.stringify(d.created)):
info: {"_seconds":1543405587,"_nanoseconds":169000000}
JSON.stringify(d.created.toDate())
into: "2018-11-28T11:46:27.169Z"

因此调用 d.created.toDate() 应该 就足够了。但我遇到过其他情况,其中 Date 对象只是不由可调用函数返回,例如:

const testObject = {
some: 'thing',
d: new Date()
}

console.log('JSON:', JSON.stringify(testObject))

return projectRef.get().then(snapshot => {
return {
testObject,
projects: _.chain(snapshot.docs)
.keyBy('id')
.mapValues(s => s.data())
.forEach(d => { console.log('d.created is:', JSON.stringify(d.created.toDate())); d.created = d.created.toDate() })
.value()
}
})

请注意在下面的输出中,JSON.stringify() 对日期对象的记录结果似乎有效,但是当这些对象包含在从函数返回的对象中时,它们都会出现作为空对象:

firebase > getAllProjects({uid: 1234})
Sent request to function.
firebase > info: User function triggered, starting execution
info: JSON: {"some":"thing","d":"2018-11-28T13:22:36.841Z"}
info: Got 1 projects
info: d.created is: "2018-11-28T11:46:27.169Z"
info: Execution took 927 ms, user function completed successfully

RESPONSE RECEIVED FROM FUNCTION: 200, {
"result": {
"testObject": {
"some": "thing",
"d": {}
},
"projects": {
"XcRyQyaxLguRdbNmxQdn": {
"description": "c",
"created": {},
"name": "c"
}
}
}
}

最佳答案

来自documentation :

To send data back to the client, return data that can be JSON encoded.

Date is not a JSON type ,您将不得不为它使用自己的序列化格式(至少如果您希望它可靠/可移植)。从链接的答案听起来像 Date.toJSON是一个很好的候选人。

关于javascript - 在云可调用函数中返回日期/服务器时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53520674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com