注销时,Firebase在数据库侦听器上给出错误

时间:2020-04-16 17:17:04

标签: javascript reactjs firebase firebase-realtime-database firebase-authentication

我设法提供了身份验证功能,用户可以在其中使用:

  1. 注册
  2. 登录
  3. 更新/删除帐户
  4. 退出

一切正常,直到我退出。我将onSnapshot()用于更新功能 因此,每次auth状态更改时,我都会将返回的数据设置为组件状态。

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();

}

我退出时会发生以下错误:

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 个答案:

答案 0 :(得分:2)

您的Firestore安全规则似乎要求对用户进行身份验证以读取某些数据。因此,当您注销用户时,该数据的侦听器将被拒绝。

防止错误消息的解决方案是在注销用户之前,在代码中自己删除侦听器。因此,将unsubscribe保留在对象中的某个字段中,可以从signOut()到达该字段,然后:

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

答案 1 :(得分:0)

因此解决此问题的方法是:

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();
}

谢谢frank

相关问题