DocumentSnapshot.exists возвращает false, когда документ существует

#reactjs #firebase #react-native #google-cloud-firestore

#reactjs #firebase #реагирующий-собственный #google-облако-firestore

Вопрос:

Я использую React Native и Firebase Firestore. Ниже приведен мой код, в котором ошибка сохраняется. Он должен отображать true, поскольку документ существует внутри firestore, однако он продолжает возвращать false . Я попытался протестировать его со значением, которое я вручную создал на веб-сайте Firestore, и свойство .exists было true . Когда я создаю документ с помощью .однако set возвращает false . У кого-нибудь есть объяснение или решение относительно того, почему это может происходить? Я ссылался на другие статьи StackOverflow, но они не помогли, поскольку, похоже, это не происходит ни с кем другим. Дайте мне знать, если потребуется дополнительная информация. Заранее спасибо.

 export default class GuestSession extends Component {

    state = {
        isLoading: true,
        users: [],
        code: 0
    }

     constructor(props) {
        super(props);

        let displayName = firebase.auth().currentUser.displayName
        this.state.code = props.route.params.code

         const docRef = firebase.firestore().collection('sessions').doc(this.state.code)

         docRef.get().then((docSnapshot) => {
             if(docSnapshot.exists) {
                 console.log("exists")
             } else {
                 console.log("doesn't exist")
             }
         })

        this.state.isLoading = false


    }
}
 

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

1. Есть ли у вас какие-либо правила безопасности, которые препятствовали бы созданию документа? Также вы уверены, что this.state.code это значение отличается от значения по умолчанию 0?

Ответ №1:

Я разобрался со своей проблемой. При динамическом создании документов на ходу вы хотите убедиться, что сначала вы создаете один документ, а не документ, который включает в себя коллекцию с другим документом. Например,

 //dynamic document creation of 2 separate documents
firebase.firestore().collection('sessions').doc(this.state.code)
.collection('users').doc('exampleUserDocument').set({username: username})
 

вместо этого должно быть записано как

 const sessionRef = firebase.firestore().collection('sessions')
sessionRef.doc(this.state.code).set({exampleField: value}) 
//properly sets session document

sessionRef.doc(this.state.code).collection('users').doc('exampleUserDocument').set({username: username})
//properly sets user document
 

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