【问题标题】:Firebase gives error on database listener when signing out退出时,Firebase 在数据库侦听器上出现错误
【发布时间】:2020-07-30 00:57:30
【问题描述】:

我设法制作了一个用户可以使用的身份验证功能:

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

}

当我退出时出现以下错误:

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

});

【问题讨论】:

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


    【解决方案1】:

    您的 Firestore 安全规则似乎要求用户经过身份验证才能读取某些数据。因此,当您注销用户时,该数据的侦听器会被拒绝。

    防止出现错误消息的解决方案是在用户退出之前自行在代码中删除侦听器。因此,将unsubscribe 保留在对象的一个​​字段中,您可以从signOut() 访问它,然后:

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

    【讨论】:

    • 我把答案发给你我的朋友。
    【解决方案2】:

    所以这个问题的解决方法是:

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

    我在state中设置了unsubscribe函数,稍后在sign out中使用:

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

    谢谢frank

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2018-12-18
      • 2018-06-15
      • 1970-01-01
      • 2021-03-26
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多