我设法提供了身份验证功能,用户可以在其中使用:
一切正常,直到我退出。我将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 }));
});
答案 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。