我使用vuex和火力点实施的指令后用户认证vuegram。我尝试了多种方法来分离Firebase侦听器,以下是唯一一种停止警告错误的方法:
var unsubscribe=fb.auth.onAuthStateChanged(user=>{
if(user){
store.commit('setCurrentUser',user)
store.dispatch('fetchUserProfile')
fb.usersCollection.doc(user.uid).onSnapshot(doc => {
store.commit('setUserProfile', doc.data())
})
}
})
unsubscribe();
但是,上面的代码只是在signOut()上停止警告,我再也不能更新数据了。
我的store.js文件:
var unsubscribe=fb.auth.onAuthStateChanged(user=>{
if(user){
store.commit('setCurrentUser',user)
store.dispatch('fetchUserProfile')
fb.usersCollection.doc(user.uid).onSnapshot(doc => {
store.commit('setUserProfile', doc.data())
})
}
})
export const store=new Vuex.Store({
state:{
currentUser:null,
userProfile:{}
},
actions:{
clearData({commit}){
commit('setCurrentUser',null)
commit('setUserProfile', {})
},
fetchUserProfile({ commit, state }) {
fb.usersCollection.doc(state.currentUser.uid).get().then(res => {
commit('setUserProfile', res.data())
}).catch(err => {
console.log(err)
})
},
updateProfile({ commit, state }, data) {
let displayName = data.displayName
fb.usersCollection.doc(state.currentUser.uid).set({
displayName: displayName
}, {merge:true}).then(function() {
alert("Document successfully written!");
})
.catch(function(error) {
alert("Error writing document: ", error);
});
}
},
mutations:{
setCurrentUser(state, val) {
state.currentUser = val
},
setUserProfile(state, val) {
state.userProfile = val
}
}
})
signOut方法:
signOut: function(){
fb.auth.signOut().then(()=> {
this.$store.dispatch('clearData')
this.$router.push('login')
}).catch(function(error) {
console.log(error);
});
}
我的Firebase规则:
allow read, write: if request.auth.uid!=null;
由于注销时你仍然具有活动的侦听器,因此系统检测到客户端失去了读取该数据的权限,因此拒绝了该侦听器。这意味着你需要在注销之前删除侦听器,以防止出现错误消息。
请参阅有关分离侦听器的文档,你在附加侦听器时首先会获得对unsubscribe函数的引用:
unsubscribe = fb.usersCollection.doc(user.uid).onSnapshot(doc => {
store.commit('setUserProfile', doc.data())
})
然后在退出之前调用该函数:
signOut: function(){
unsubscribe();
fb.auth.signOut().then(()=> {
this.$store.dispatch('clearData')
this.$router.push('login')
}).catch(function(error) {
console.log(error);
});
}
仍然给我错误。是否有必要捕获此错误?为什么signOut方法不能自动为我们分离监听器?
有很多用例,当用户注销时,侦听器可以保持活动状态。但是在您的情况下,监听器被删除了,它只是明确地告诉您它已被取消,因为这可能是个问题。如果这是您想要的结果,则可以根据需要忽略该错误。但是,如果仍然出现错误,那么您仍然在某个地方需要某个经过身份验证的用户的侦听器,因此我个人非常希望知道此时我的代码在做什么。
感谢Puff,我只是使用
get()
method而不是获取数据onSnapshot()
,并且错误消失了。在退出之前必须删除监听器是荒谬的。一旦Firestore实例知道您需要签名的实例,并且在未经许可的情况下无法访问其中的一个实例时,则在注销时应将其隐式化。退出应该只是自动取消所有订阅,因此,您必然需要跟踪每个快照事件……现在在像我这样的大型应用程序上想象一下。没有道理
当侦听器失去对基础数据的访问权限时,它将自动取消。为确保您了解此情况,这将引发被取消的侦听器的错误事件。