Firestore / Javascript: Как получить данные документа, используя временные метки? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь создать линейный график для своего проекта. Для выполнения sh мне нужны два date ввода от пользователя. Оттуда мой бэкэнд принимает входные данные, преобразует его в объект даты javascript.

Моя проблема заключается в том, что когда я пытаюсь преобразовать объекты даты в метку времени пожарного депо, я получаю эту ошибку.

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);

Этот код выполняет преобразование объекта даты в объект отметки времени пожарного депо. Оттуда я должен использовать 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);

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Вам нужно сделать

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

, потому что

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

преобразует дату в toString ()

и

fromDate is метод stati c из класса stati c Timestamp из Firebase. Если вы хотите сохранить поле как отметку времени в Firestore, вам нужно будет отправить объект JavaScript Date или объект отметки времени Firestore в качестве значения поля

1 голос
/ 12 марта 2020

Я иду на go вперед и сделаю вызов, что ваш объект "date" на самом деле не является JavaScript объектом Date. Это, вероятно, просто отформатированная строка. Вы не сможете работать с этим очень эффективно, если попытаетесь запросить поля меток времени Firestore.

Возможно, вам потребуется изменить любой источник данных, который питает эти строки кода. :

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

Вам нужно убедиться, что sessionStorage.getItem возвращает что-то подходящее для запроса Firestore. Это может быть правильный объект даты или какое-то время unix в миллисекундах, которое вы можете легко преобразовать в метку времени.

0 голосов
/ 12 марта 2020

Мне нравится создавать полную структуру кода, но я уже отметил ответ. Несмотря на это, я опубликую код здесь, потому что он может помочь другим людям.

Получить входные значения из форм и использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...