通过 Cloud Functions 返回后,Web Firebase var 从时间戳类型更改为对象类型
Posted
技术标签:
【中文标题】通过 Cloud Functions 返回后,Web Firebase var 从时间戳类型更改为对象类型【英文标题】:Web Firebase var changes from Timestamp type to object type after return through Cloud Functions 【发布时间】:2020-08-09 12:36:29 【问题描述】:我想通过云函数返回一个 Firebase Timestamp 对象。在我将它返回到前端后,它不再具有 firebase Timestamp 类型。 我得到的错误是::
timestamp.toMillis is not a function
(toMillis 是特定于 firebase Timestamp 的方法,https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp)
如果我不使用云函数直接从前端获取数据,则类型仍然存在。
后端返回的代码:
snapshot.forEach(doc =>
messageArray.push(
...
timestamp: doc.data().timestamp,
...
);
);
return messageArray;
前端:
var getMessages = firebase.functions().httpsCallable('getMessages');
getMessages(
data: displayName,
chatType: chatType
).then(function (result)
console.log("loading messages");
result.data.forEach(message =>
console.log(typeof message.timestamp);
console.log(message.timestamp);
var timestamp = message.timestamp;
var millis = timestamp.toMillis();
);
如果我要在没有像这样的云功能的情况下获取我的数据,它可以工作:
query.onSnapshot(function (snapshot)
snapshot.docChanges().forEach(function (change)
if (change.type === 'removed')
deleteMessage(change.doc.id);
else
var message = change.doc.data();
console.log(message.timestamp);
console.log(typeof message.timestamp);
var timestamp = message.timestamp;
var millis = timestamp.toMillis();
);
);
为什么类型会改变,如何将其转换为 Firebase 时间戳?
云功能版本日志:
只有前端版本日志:
【问题讨论】:
【参考方案1】:可调用类型的云函数将响应序列化为纯 JSON。不保留任何对象类型。当响应中有 Timestamp 对象时,functiosn SDK 将简单地在其上调用toJSON
以获取用于序列化的 JSON 对象。同样,当它到达客户端应用程序时,它将完全丢失其类型信息,并包含其秒和纳秒组件的 only 属性。这就是您的控制台日志实际显示的内容 - 一个具有两个属性的普通 javascript 对象。
如果您想在客户端将该 JSON 对象转换为 Timestamp,则需要从反序列化对象中读取 seconds 和 nanoseconds 属性并将它们传递给Timestamp constructor。
【讨论】:
以上是关于通过 Cloud Functions 返回后,Web Firebase var 从时间戳类型更改为对象类型的主要内容,如果未能解决你的问题,请参考以下文章
尝试通过 Firebase Cloud Functions (Android) 发送通知后出现错误
Cloud Functions 返回 403 错误也具有 Cloud Functions Invoker 权限
Cloud Functions for Firebase onWrite 超时
如何在 Firebase Cloud Functions 中确认 PubSub 消息?