У меня была такая же проблема. Есть две вещи, которые нужно проверить.
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
одновременно. Вы можете обновить старый пакет, чтобы исправить это.