# #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 (), по-видимому, привело к зависанию запроса. В любом случае спасибо за помощь 🙂