Как перестать прослушивать изменения базы данных в Firebase Firestore?

# #javascript #firebase #google-cloud-firestore

Вопрос:

У меня есть веб-приложение, встроенное в Nextjs и использующее Firebase Firestore для хранения данных. Все остальное в приложении нормально, но инструменты, которые проверяют скорость веб-сайта, дают ему ужасные оценки, потому что запросы в Firestore никогда не заканчиваются, даже если приложение уже получило все необходимые данные на интерфейсе.

Мой код для извлечения данных:

 const getData = () => {
        const q = query(collection(firestore, "data"), where("published", "==", true));
        const data = [];
        const unsubscribe = onSnapshot(q, (querySnapshot) => {
          querySnapshot.forEach((doc) => {
            data.push({id: doc.id, ...doc.data()});
          });
        });

        return data
}
 

Функция возврата данных работает нормально, и все возвращается быстро, но запрос продолжает висеть без завершения. Я прикрепил скриншот, снятый с Chrome devtools.
Изображение: «ВНИМАНИЕ: запрос еще не завершен!»
Как заставить Firestore прекратить прослушивание изменений в базе данных?

Я пытался искать решения повсюду в Интернете и обнаружил, что некоторые люди говорят, что использование «const отписаться = …» для определения запроса, а затем вызов «отписаться ()» будет работать, но вызов «отписаться ()» по какой-то причине не позволяет функции возвращать данные вообще.

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

1. Вам нужно получить данные только один раз ?

2. В идеале я мог бы запускать извлечение данных всякий раз, когда это необходимо, и он получал бы данные в их текущем состоянии в данный момент времени, не поддерживая соединение. Так, например, я мог бы получать данные, когда пользователь попадает на главную страницу, а затем обновлять их, когда они возвращаются на главную страницу (если они перемещаются между ними).

Ответ №1:

Если вы хотите получить данные только один раз, используйте getDocs() вместо этого:

 const getData = async () => {
  const q = query(collection(firestore, "data"), where("published", "==", true));
  const querySnapshot = await getDocs(q);
  return querySnapshot.docs.map(doc => ({id: doc.id, ...doc.data()}))
}
 

В отличие onSnapshot() от этого , getDocs() не будет прослушивать обновления в реальном времени. Вы можете просто позвонить getData() еще раз, чтобы перезагрузить данные. Вы можете узнать больше о получении данных из Firestore в документации.

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

1. Спасибо за предложение, но, к сожалению, это не помогло… Я пробовал просматривать документацию и пробовать разные вещи, но все еще есть этот странный запрос на базу, который не заканчивается. Я также сузил его до этой конкретной функции, так как проблема исчезает, когда я удаляю единственный компонент, которому нужны эти данные.

2. @Markus вы пытались перезагрузить сервер разработчиков или очистить кэш ?

3. Да, я это сделал. Ни перезапуск моего локального сервера разработчиков, ни развертывание измененной функции в Vercel для живого тестирования не помогли. Извлечение по-прежнему работает нормально, но этот единственный запрос не позволяет мне получить какие-либо значимые данные о маяке. Не знаю, поможет ли это, но URL-адрес запроса начинается с: firestore.googleapis.com/google. firestore.v1.Firestore/Слушать/… {имя моего проекта}/databases/(по умолчанию)amp;gsessionid=…

4. @Markus это случайно не на Github? или вы можете по крайней мере поделиться соответствующими компонентами, которые могут помочь клонировать эту проблему,

5. При создании легкого демонстрационного приложения, которым я мог бы поделиться с вами, я случайно попытался использовать «getStaticProps ()» Nextjs, что по какой-то причине решило мою проблему. Использование SWR или извлечение данных внутри useEffect (), по-видимому, привело к зависанию запроса. В любом случае спасибо за помощь 🙂