首页 > 解决方案 > 为什么我的 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);
  }
};

标签: javascriptfirebasedatetimegoogle-cloud-firestore

解决方案


看起来您希望传递给可调用函数的 Timestamp 对象的类型在客户端和服务器之间保留。不幸的是,它不是那样工作的。当 Timestamp 对象被序列化时,它只是转换为具有 seconds 和 nanoseconds 属性的 JavaScript 对象。另一端的可调用函数不会自动将该对象重构为时间戳。事实上,所有类型都丢失了,一切都只是转换为 JSON。

您需要做的是在函数中获取该序列化对象并自己将其转换回时间戳,然后再将其传递给 Firestore SDK。然后,SDK 会安排 Firestore 将其保存为时间戳类型字段。这意味着您将不得不对data参数进行一些初始处理,并确保它具有所有正确的值以写入 Firestore。

同样,如果不完全清楚 - 对象的类型必须与 Firestore SDK 调用正确。您不能传递任意对象并期望它进行智能转换。


推荐阅读