Firebase выдает ошибку при прослушивании базы данных при выходе - PullRequest
0 голосов
/ 16 апреля 2020

Мне удалось создать функцию аутентификации, в которой пользователь может использовать:

  1. регистрация
  2. вход
  3. обновление / удаление учетной записи
  4. Выйти

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

firebase_auth.auth().onAuthStateChanged(user => {

    if(user) {

     firebase.collection('users').doc(user.uid).onSnapshot(doc => {

      doc.exists && this.setState(prevState => ({ ...prevState, user_data: doc.data() }));      

     });

 } else this.setState(prevState => ({ ...prevState, user_data: null }));

});

signOut() {

 firebase.auth().signOut();

}

Когда я выхожу, возникает следующая ошибка:

Uncaught Ошибка в onSnapshot: FirebaseError: Отсутствует или недостаточно разрешений.

Вот мои правила базы данных. Я использую firebase cloud storage .

service cloud.firestore {    
  match /databases/{database}/documents {      
    match /users/{uid} {        
      allow read, write: if request.auth.uid == uid      
    }    
  }  
} 

И если я остановлю onSnapshot listener, даже log in не будет работать.

firebase_auth.auth().onAuthStateChanged(user => {

    if(user) {

     const unsubscribe = firebase.collection('users').doc(user.uid).onSnapshot(doc => {

       doc.exists && this.setState(prevState => ({ ...prevState, user_data: doc.data() }));
     });

     unsubscribe();

 } else this.setState(prevState => ({ ...prevState, user_data: null }));

});

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Кажется, ваши правила безопасности Firestore требуют, чтобы пользователь прошел аутентификацию для чтения определенных данных. По этой причине прослушиватели этих данных отклоняются при выходе пользователя из системы.

Решение для предотвращения сообщения об ошибке состоит в том, чтобы самостоятельно удалить слушателей в своем коде перед выходом пользователя из системы. Поэтому оставьте unsubscribe в поле в объекте, где вы можете достичь его от signOut(), а затем:

signOut() {
  unsubscribe();
  firebase.auth().signOut();
}
0 голосов
/ 16 апреля 2020

Таким образом, решение этой проблемы:

firebase_auth.auth().onAuthStateChanged(user => {

  if(user) {

   const unsubscribe = firebase.collection('users').doc(user.uid).onSnapshot(doc => {

    doc.exists && this.setState(prevState => ({ ...prevState, user_data: doc.data() }));   

   });

   this.setState(prevState => ({ ...prevState, unsubscribe });

 } else this.setState(prevState => ({ ...prevState, user_data: null }));

});

Я установил функцию unsubscribe в state и позже использую ее в sign out:

signOut() {
  this.state.unsubscribe();
  firebase.auth().signOut();
}

Спасибо Фрэнк .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...