Firestore возвращает документ, даже если его не существует

#typescript #firebase #google-cloud-firestore

#typescript #firebase #google-облако-firestore

Вопрос:

Я использую веб-API, Typescript, никаких других библиотек.
Я настроил очень простую базу данных. Пользователи регистрируются с помощью электронной почты / пароля, и документ добавляется в /users коллекцию с их uid в качестве ключа. Когда пользователь входит в систему, я сверяю его uid с /users коллекцией и возвращаю соответствующий документ.

Я возился с правилами безопасности, проверял свою логику и регулярно вручную удалял пользователей и данные через консоль Firebase по ходу работы. Я не знаю, что-то перепуталось, но теперь моя база данных полностью пуста в соответствии с вкладкой данных консоли — нет /users коллекции или чего-то еще — но когда я запускаю…

this.db.doc(`users/${firebase.auth().currentUser.uid}`).get()

… Я получаю обратно документ с правильным идентификатором (соответствует моему зарегистрированному идентификатору пользователя), но exists свойство есть false . Откуда это берется?

Поскольку база данных пуста, я предполагаю, что она из какого-то локального кэша?
Или я что-то перепутал или вышел из синхронизации, удалив данные вручную?
Могу ли я очистить этот кеш или мне нужно выполнить дополнительную проверку на exists:false

Приветствую всех

Ответ №1:

Я получаю обратно документ с правильным идентификатором (соответствует моему зарегистрированному идентификатору пользователя), но свойство exists равно false . Откуда это берется?

Вы всегда получите DocumentSnapshot для любого отдельного документа get() . Именно так это и работает. Вам обязательно нужно проверить флаг exists (или посмотреть, который data() возвращает объект), чтобы узнать, есть ли какие-либо данные в этом снимке. На самом деле это не сложнее, чем это.

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

1. @shn: Я понимаю вопрос так же, как и Дуг здесь. DocumentReferenceget() Вызов всегда возвращает DocumentSnapshot объект, даже если в базе данных (или кеше) нет документа. Если действительно такого документа не существует, exists свойство DocumentSnapshot `false .

2. Ах, хорошо, итак, тот факт, что идентификатор соответствует запросу, объясняется только тем, что он возвращается на основе этого запроса, а не потому, что у него есть какая-то кэшированная версия более старого экземпляра. Это имеет смысл (я думаю) и может даже объяснить другое странное поведение, которое я видел. Сейчас я занимаюсь чем-то другим, но проверю это сегодня вечером в своей сборке.

3. Идентификатор в DocumentSnapshot всегда будет точно таким, какой вы использовали в DocumentReference . Обратите внимание, что DocumentSnapshot также используется в результатах запроса, где вы не знаете идентификаторы заранее. В этом контексте идентификатор является более полезной информацией.

4. Да, теперь все начинает обретать смысл. Вроде как 🙂 Приветствую ответ. Я уверен, что скоро вернусь с большим количеством.