登录后,我订阅了一些firebase引用,然后注销(FirebaseAuth.logout)。一旦我注销,我在控制台中收到Firebase警告:“用户回调抛出了异常。错误:允许在...处的许可”,这成为一个实际的异常。虽然我确实希望看到这种行为,但是记录用户的最佳做法是什么,所以我没有看到这个警告/异常?
答案 0 :(得分:9)
我遇到了同样的问题。通过以下来源,到目前为止我找到了一个解决方案,但我还不满意。 Source 1
问题的根本在于,您的代码中某处仍然存在开放的,未订阅的订阅(与Firebase的连接)。
例如我做了
this.name_sub = this.af.database.object("/users/" + user.uid + "/name")
.subscribe(data => {
this.globals.user.name = data.$value;
}
);
在您调用this.af.auth.logout();
之前,这是完全正常的。如果您的Firebase安全设置正确,Firebase将抛出错误,因为您不再登录该用户 - 您现在是匿名用户,应该在用户空间内被阻止。由于上述订阅仍然有效,Firebase会告诉您,您无法匿名访问目标用户空间。
因此,必须关闭订阅。你可以这样做的方法就是添加
ngOnDestroy(){
this.name_sub.unsubscribe();
}
组件中的某个位置。这会在您component is destroyed时关闭您的订阅。不幸的是,这对我来说是不可能的,因为我正在另一个组件中进行注销。我现在正在做的就是在收到一个值后立即关闭订阅。
this.name_sub = this.af.database.object("/users/" + user.uid + "/name")
.subscribe(data => {
this.globals.user.name = data.$value;
this.name_sub.unsubscribe(); // <-- important part
}
);
对我来说,这是非常反直觉的。我认为我们需要一种方法来接收价值而无需永久订阅数据通道而无需导入其他模块。
答案 1 :(得分:-1)
它很难看,但有效:
signOut(): void {
this.router.navigate(['/app').then(() => {
firebase.database().goOffline() // <=== this eliminates error!
this.afAuth.auth.signOut()
})
}