Angular Firebase извлекает метки времени как дату - PullRequest
0 голосов
/ 05 апреля 2020

В настоящее время я запускаю проект Angular с Firebase в качестве серверного бэкэнда. В приложении есть две основные модели user и product. Обе эти модели имеют несколько разных временных отметок, таких как createdAt, updatedAt, lastPurchase, ...

interface User {
    id: string;
    displayName: string;
    lastPurchase?: Date;
    createdAt: Date;
    updatedAt?: Date;
}
interface Product{
    id: string;
    title: string;
    pricing: number;
    category: string;
    user: User;
    createdAt: Date;
    updatedAt?: Date;
}

Проблема в том, что я работаю с Date типа, но Firebase доставляет сохраненные даты, подобные этой t {seconds: 1584540876, nanoseconds: 300000000}. Поэтому я вынужден конвертировать все входящие временные метки Firebase в типы JavaScript Date. Кроме того, поскольку Firebase's Firestore является базой данных № SQL, я никогда не могу быть уверен, какой документ содержит какие свойства отметки времени (для нулевых проверок).

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

    // Iterate over all properties in product
    for (let key in data) {
      // Check if property is an object
      if (data[key] instanceof Object) {
        // Check if the object is Firebase Timestamp
        if (data[key].constructor.name === 't') {
          const property: string = key;
          console.log(data[key]);
          data[key] = data[property].toDate();
          // Check if property is an user
        } else if (key === 'user') {
          // Iterate over all user properties
          for (let userKey in data[key]) {
            // Check if user property is an object and the object is Firebase Timestamp
            if (data[key][userKey] instanceof Object && data[key][userKey].constructor.name === 't') {
              const userProperty: string = userKey;
              data[key][userKey] = data[key][userProperty].toDate();
            }
          }
        }
      }
    }

Есть ли альтернативное решение / метод для достижения этого с меньшими затратами вычислений?

1 Ответ

0 голосов
/ 05 апреля 2020

Если вы хотите отобразить дату, просто используйте канал даты angular.

<div>{{user.updatedAt.toDate() | date: 'medium'}}</div>

У канала даты есть и другая опция, например, полная, короткая.

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

import { firebase } from 'firebase/app';
import Timestamp = firestore.Timestamp;

interface User {
    id: string;
    displayName: string;
    lastPurchase?: Timestamp;
    createdAt: Timestamp;
    updatedAt?: Timestamp;
}

Затем, когда вы обновите их, вы можете сделать это, используя функцию now:

User.update({
    updatedAt: Timestamp.now();
})

Это сохранит обновленные данные в то время, когда вы можете функция для обновления. Аналогичным образом вы можете обновить созданные и другие даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...