Не могу получить данные из базы данных, используя метку времени - PullRequest
3 голосов
/ 09 ноября 2019

Я пытаюсь получить значение из моей коллекции, используя свойство createdAt, которое является отметкой времени. Примерно так выглядит мой запрос:

function getDataFromYesterdayToNow (db){
  const now = new Date()
  const yesterday = new Date(now.setDate(now.getDate() - 1))
  yesterday.setHours(0, 0, 0, 0)

  const { Timestamp } = firebase.firestore

  return db
    .collection('myData')
    .where('createdAt', '>=', Timestamp.fromDate(yesterday))
    .where('createdAt', '<=', Timestamp.fromDate(now))
    .get()
}

Однако, когда я его запускаю, я получаю следующую ошибку:

error is 'FirebaseError: [code = invalid-аргумент]: функция Query.where () вызвана с неверными данными. Неподдерживаемое значение поля: пользовательский объект Timestamp '. Stacktrace был 'FirebaseError: функция Query.where () вызвана с неверными данными. Неподдерживаемое значение поля: пользовательский объект Timestamp

Я очень запутался, я всегда выбирал объекты Timestamp из других коллекций, и это не работает, если я пытаюсь просто использовать объект даты. Я что-то забыл?

Редактировать: по запросу, вот пример того, как выглядит мой документ:

{
  name: "My Data Name", // (string)
  createdAt: November 9, 2018 at 8:40:45 PM // (Timestamp)
}

1 Ответ

1 голос
/ 16 ноября 2019

У меня была такая же проблема. Есть две вещи, которые нужно проверить.

1. Использую ли я нужный SDK?

Знаете ли вы, что вы можете использовать два разных Firebase SDK? Один из них - клиентский SDK ( пакет firebase-js-sdk aka firebase), а другой - firebase серверный SDK ( nodejs-камин .aka @google-cloud/firebase пакет). Эти две библиотеки имеют собственную реализацию класса firestore.Timestamp, и ОНИ НЕ СОВМЕСТИМЫ .

Некоторые из других зависимостей пакетов NPM:

"@firebase/firestore" (*)
  -> "firebase" (client SDK which imports all @firebase/* except @firebase/testing)
    -> "@angular/fire" (and other client libraries with firebase binding)
    -> "@firebase/testing" (mocking Firestore client)

"@google-cloud/firebase" (*) (server SDK)
  -> "firebase-admin"
    -> "firebase-functions-test"

Где(*) обозначает местоположение определения firestore.Timestamp.

Короче говоря, вы должны использовать соответствующую метку времени.

Случай 1. Используйте только клиентский SDK

import { firestore, initializeApp } from 'firebase';
import { config } from './my-firebase-config';

const app = initializeApp(config);
app.firestore().collection('users')
  .where('createdAt', '<=', firestore.Timestamp.fromDate(new Date()))
  .get();

Случай 2. Используйте только серверный SDK

import { firestore, initializeApp } from 'firebase-admin';

const app = initializeApp();
app.firestore().collection('users')
  .where('createdAt', '<=', firestore.Timestamp.fromDate(new Date()))
  .get();

Случай 3. Смешивание SDK

Иногда вам нужно использовать клиентский SDK (в частности, @firebase/testing) при тестировании кода, которыйзапуск на сервере (например, функции Firebase.)

// server.ts
import { firestore, initializeApp } from 'firebase-admin';

const app = initializeApp();
app.firestore().collection('users')
  .where('createdAt', '<=', fs.Timestamp.fromDate(new Date()))
  .get();
// server.test.ts
import { firestore } from 'firebase';
import { initializeAdminApp } from '@firebase/testing';

// Replace server sdk with client sdk
jest.mock('firebase-admin', () => ({
  firestore,
  initializeApp: () => initializeAdminApp()
}));

2. Использую ли я правильную версию?

Если вы используете правильный SDK, следующая вещь, чтобы проверить, используете ли вы ту же версию реализации Timestamp. Если вы, например, используете Client SDK, вам следует проверить package-lock.json, имеет ли он уникальную версию firebase.

. Для моего случая я установил @firebase/testing и firebase вв разное время, и из-за отличия версии firebase от @firebase/testing, у меня были установлены два разных пакета firebase одновременно. Вы можете обновить старый пакет, чтобы исправить это.

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