javascript - 为什么我的 JavaScript 日期/时间对象存储为地图而不是 Cloud Firestore 中的时间戳?
问题描述
所附图片是我的 Firestore 文档中两个“日期/时间”条目的屏幕截图。
timeCompleted是我直接在数据库中输入的值,选择“timestamp”作为字段类型。根据屏幕截图,您可以看出日期/时间以可读的格式显示(对我来说并不重要)。
timeCreated是我的 JavaScript Reactjs 应用程序添加的值,使用Google docsfirebase.firestore.Timestamp.fromDate(new Date(myDate + " " + myTime))
规定的。与存储为时间戳类型相反,它存储为包含纳秒和秒的映射。
有没有办法将我的 JavaScript 日期 (timeCreated) 存储为真正的时间戳,类似于 timeCompleted?
我的 firebase 类(通过 React 的 Context API 导入)
import app from "firebase/app";
import "firebase/firestore";
import "firebase/functions";
const config = {
apiKey: ...,
authDomain: ...,
databaseURL: ...,
projectId: ...
};
class Firebase {
constructor() {
app.initializeApp(config);
this.auth = app.auth();
this.firestore = app.firestore;
this.functions = app.functions;
}
}
export default Firebase;
我的反应组件
import React, { useState, useEffect, useContext } from "react";
import { FirebaseContext } from "../../Firebase";
const InnerComponent = React.memo(props => {
const firebase = useContext(FirebaseContext);
//Calls Google Cloud function below
firebase.functions().httpsCallable("storeInDb")({
const myDate = "2019-02-25";
const myTime = "17:45";
orderDetails {
name: "someName",
timeCreated: firebase.firestore.Timestamp.fromDate(new Date(myDate + " " + myTime))
}
)}
我的谷歌云功能
exports.storeInDb = functions.https.onCall(async (data, context) => {
return id = await orderCreation(data.orderDetails);
});
const orderCreation = async orderDetails => {
try {
const docRef = await admin.firestore()
.collection(pathToCollection...)
.add(orderDetails);
return docRef.id;
} catch (error) {
console.log("ORDER CREATION ERROR", error);
}
};
解决方案
看起来您希望传递给可调用函数的 Timestamp 对象的类型在客户端和服务器之间保留。不幸的是,它不是那样工作的。当 Timestamp 对象被序列化时,它只是转换为具有 seconds 和 nanoseconds 属性的 JavaScript 对象。另一端的可调用函数不会自动将该对象重构为时间戳。事实上,所有类型都丢失了,一切都只是转换为 JSON。
您需要做的是在函数中获取该序列化对象并自己将其转换回时间戳,然后再将其传递给 Firestore SDK。然后,SDK 会安排 Firestore 将其保存为时间戳类型字段。这意味着您将不得不对data
参数进行一些初始处理,并确保它具有所有正确的值以写入 Firestore。
同样,如果不完全清楚 - 对象的类型必须与 Firestore SDK 调用正确。您不能传递任意对象并期望它进行智能转换。
推荐阅读
- oauth - Can Oauth be used securely from the client side for a back-end service?
- git - 在添加 .gitignore 之后,Git 刚刚清除了我一半的本地存储库,随机的东西被拉到我的另一台机器上
- java - 在应用程序中创建帖子并通过改造发送到服务器
- python - 为什么 Django QuerySet 不支持加入 manyTomany?
- python - 需要分析时间序列数据的趋势
- java - 如何中断线程工作,然后在工作后休眠?
- php - 将数组从 Python 发送到 PHP
- regex - 使用正则表达式删除部分列值
- kubernetes - 实时监控容器、节点和集群
- tensorflow - 如果 Tensorflow 中的 tf.cond 检查失败,如何停止图形执行或更改控制流?