【问题标题】:Firestore/Javascript: How to get document data using timestamps?Firestore/Javascript:如何使用时间戳获取文档数据?
【发布时间】:2020-03-12 16:33:22
【问题描述】:

我正在尝试为我的项目创建折线图。为此,我需要来自用户的两个date 输入。从那里我的后端将输入转换为 javascript 日期对象。

我的问题是当我尝试将日期对象转换为 Firestore 时间戳时出现此错误。

TypeError: t.getTime 不是函数 在 Function.ho.fromDate (timestamp.ts:27) 在 Object.next (generateReportDateRange.php:158) 在 subscribe.ts:104 在 subscribe.ts:233

(generateReportDateRange.php:158) 行指向此代码:

var toTimeStampOne = firebase.firestore.Timestamp.fromDate(dateIdOne);

该代码所做的是将日期对象转换为 Firestore 时间戳对象。从那里我应该使用toTimeStampOne 作为查询从documents 获取某些数据

这里是可能与问题有关的后端代码:

var dateIdOne = sessionStorage.getItem("dateOne");
var dateIdTwo = sessionStorage.getItem("dateTwo");

var dateSetArray = [];
var dataCal = [];

console.log(dateIdOne); //OUTPUT: Fri Mar 06 2020 08:00:00 GMT+0800 (Philippine Standard Time)
console.log(dateIdTwo); //OUTPUT: Tue Mar 10 2020 08:00:00 GMT+0800 (Philippine Standard Time)

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    this.userId = user.uid;
  } //stores the user id in variable
  var toTimeStampOne = firebase.firestore.Timestamp.fromDate(dateIdOne);
  var toTimeStampTwo = firebase.firestore.Timestamp.fromDate(dateIdTwo);
  var dateSetArray = [];
  var dataCal = [];
  let userRef1 = firebase.firestore().collection("users").doc(userId).collection("glucose")
    .where("dateAdded", ">=", toTimeStampOne)
    .where("dateAdded", "<=", toTimeStampTwo)
    .limit(7);
  return userRef1.get()
    .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
        console.log(doc.id, " => ", doc.data());
        this.dateSet = doc.data().bgReading;

        dateSetArray.push(dateSet);

        this.calDateAdded = doc.data().dateAdded.toDate();
        const options = {
          month: 'short',
          day: 'numeric',
          year: 'numeric'
        };
        const date = new Date(calDateAdded);
        const americanDate = new Intl.DateTimeFormat('en-us', options).format(date);
        dataCal.push(americanDate);
      });
    });
});

编辑

这是转换的过程

//get date input from the forms and converts it to a js date object already
    var data = {
            dateOne: new Date($('#dateRangeOne').val()), 
            dateTwo: new Date($('#dateRangeTwo').val()),
            };

//stores the date object to a session storage
sessionStorage.setItem("dateOne", data.dateOne);
sessionStorage.setItem("dateTwo", data.dateTwo);

【问题讨论】:

  • 我们需要能够看到sessionStorage.getItem("dateOne") 究竟返回了什么。它甚至是 JavaScript Date 对象(而不是字符串)吗?听起来好像不是。尝试在其上调用其他 Date 方法。
  • @DougStevenson console.log(dateIdOne); //OUTPUT: Fri Mar 06 2020 08:00:00 GMT+0800 (Philippine Standard Time)
  • 是的,这是一个日期对象,还是只是一个字符串?尝试在其上调用日期方法。
  • store a field as a timestamp in Firestore, you'll have to send a JavaScript Date object or a Firestore Timestamp object
  • 试试firebase.firestore.Timestamp.fromDate(new Date(dateIdOne));

标签: javascript firebase google-cloud-firestore


【解决方案1】:

你需要做的

var dateIdOne = new Date(sessionStorage.getItem("dateOne"));
var dateIdTwo = new Date(sessionStorage.getItem("dateTwo"));

因为

sessionStorage.setItem("dateOne", data.dateOne); 

将日期转换为 toString()

fromDate 是来自 Firebase 的静态 Timestamp 类的静态方法。如果要将字段作为时间戳存储在 Firestore 中,则必须发送 JavaScript Date 对象或 Firestore Timestamp 对象作为字段的值

【讨论】:

  • 像魅力一样工作谢谢!我不熟悉sessionStorage 的工作原理。我没有说它将日期对象转换回字符串。感谢您的帮助!
【解决方案2】:

我将继续说明您的“日期”对象实际上不是 JavaScript 日期对象。它可能只是一个格式化的字符串。如果您尝试查询 Firestore 时间戳字段,您将无法非常有效地使用它。

您可能需要更改提供这些代码行的任何数据源:

var dateIdOne = sessionStorage.getItem("dateOne");
var dateIdTwo = sessionStorage.getItem("dateTwo");

您需要确保 sessionStorage.getItem 返回适合查询 Firestore 的内容。这可能是一个适当的日期对象,或者是一些以毫秒为单位的 unix 时间,您可以轻松地将其转换为时间戳。

【讨论】:

    【解决方案3】:

    我喜欢创建完整的代码结构,但我已经标记了答案。无论如何,我都会在这里发布代码,因为它可能对其他人有所帮助。

    从表单中获取输入值并使用sessionStorage 将其传递到另一个页面

    <script>
    (function(){
    $('#dateForm').on('submit', async function (e) {
       e.preventDefault();
       var data = {
       dateOne: $('#dateRangeOne').val(),
       dateTwo: $('#dateRangeTwo').val(),//get date input
       };
       if(data.dateOne.getTime() == data.dateTwo.getTime()){
         alert("Please input a valid date range! Use the specific date generator to generate a daily report");
         window.location.href = "generateReport.php"; 
         }
       else if(data.dateOne.getTime() > data.dateTwo.getTime()){
          alert("Please input a valid date range!");
          window.location.href = "generateReport.php"; 
       }
       else{                              
            firebase.auth().onAuthStateChanged(function(user){
                if(user){
                   this.userId = user.uid; //stores the userid
                   console.log(userId);
                }
                sessionStorage.setItem("dateOne", data.dateOne);
                sessionStorage.setItem("dateTwo", data.dateTwo);
                setTimeout(function(){                    
                    window.location.href = "generateReportDateRange.php"; 
                }, 3000);
                });
               }
              });
             })
           (); 
    </script>
    

    查询代码(根据两个 Firestore 时间戳对象获取文档数据)

    <script>
    var dateIdOne = new Date(sessionStorage.getItem("dateOne"));
    var dateIdTwo = new Date(sessionStorage.getItem("dateTwo"));
    
    firebase.auth().onAuthStateChanged(user => {
      if(user){
        this.userId = user.uid;
      } //stores the user id in variable
    var toTimeStampOne = firebase.firestore.Timestamp.fromDate(dateIdOne);
    var toTimeStampTwo = firebase.firestore.Timestamp.fromDate(dateIdTwo);
    let userRef1 = firebase.firestore().collection("users").doc(userId).collection("glucose")
    .where("dateAdded", ">=", toTimeStampOne)
    .where("dateAdded", "<=", toTimeStampTwo)
    .limit(7);
    //PERFORM GET DOC DATA HERE
    });
    </script>
    

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 2018-10-05
      • 2018-10-24
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2022-12-09
      相关资源
      最近更新 更多