Firestore (модульная веб-версия 9): getDocsFromCache, похоже, не работает

#javascript #reactjs #firebase #google-cloud-firestore

#javascript #reactjs #firebase #google-cloud-firestore

Вопрос:

Я новичок в Firebase, и я нашел getDocsFromCache. Я слышал, что firebase обновил свою версию до версии 9 (модульной), и мне приходится использовать больше, чем просто query.get({source: "cache"}) . Но getDocsFromCache у меня не сработало. Каждый раз, когда я звоню getDocsFromCache , он не выдает никаких ошибок, но snapshot.empty всегда имеет значение true, поэтому я не могу получить доступ к своим документам (коллекции).

Если мне нужно кэшировать вручную, как? Если нет, то чего мне не хватает?

Спасибо.

 import {
 ​collection,
 ​getDocs,
 ​getDocsFromCache,
 ​query,
} from 'firebase/firestore';
import { db } from '../firebase-config';

export const getReviews = async () => {
 ​const q = query(collection(db, 'review'));

 ​try {
   ​const snapshot = await getDocsFromCache(q);

   ​console.log(snapshot.empty);   // always true but not throwing any error

   ​snapshot.forEach((doc) => {
     ​/* ... */
   ​});

 ​} catch (e) {
   // never reach hereconst snapshot = await getDocs(q);

   /* ... */
 ​}
};
 

Комментарии:

1. getDocsFromCache пустота не является условием ошибки, когда то, что находится в кэше, говорит о том, что ваш запрос не дает результатов. Если в какой-либо момент в прошлом, когда при последнем вызове getDocs(q) не было возвращено никаких результатов, в кэше будет сохранен тот же ответ — никаких результатов. Вы можете либо очистить свой кеш, чтобы повторить попытку, либо просто выдать свою собственную ошибку, когда не получите результатов, хотя ожидали их.

2. Да, я попробовал getDocsFromCache сразу после того, как успешно получил некоторые результаты getDocs , но он всегда возвращал пустой ответ… Спасибо за ваш очень полезный комментарий.

Ответ №1:

Из документации по настройке автономного сохранения:

Для Интернета автономное сохранение по умолчанию отключено. Чтобы включить сохранение, вызовите enablePersistence метод.

Поэтому обязательно включите кэш, вызвав это сразу после инициализации Firebase и Firestore:

 import { enableIndexedDbPersistence } from "firebase/firestore"; 

enableIndexedDbPersistence(db);
 

Комментарии:

1. О, да, я пробовал enableIndexedDbPersistence(db) раньше, но у меня это не сработало… но спасибо!