Angularfire2:注销异常和最佳实践

Nor*_*eng 9 firebase angularfire angular

登录后,我订阅了一些firebase引用,然后注销(FirebaseAuth.logout).一旦我注销,我在控制台中收到Firebase警告:"用户回调抛出了异常.错误:允许在...处的许可",这成为一个实际的异常.虽然我确实希望看到这种行为,但是记录用户的最佳做法是什么,所以我没有看到这个警告/异常?

小智 9

我有同样的问题.通过以下来源,到目前为止我找到了一个解决方案,但我还不满意.来源1

问题的根本在于,代码中的某处仍然存在开放的,而非取消订阅的订阅(与Firebase的连接).

比如我做了

this.name_sub = this.af.database.object("/users/" + user.uid + "/name")
  .subscribe(data => {
    this.globals.user.name = data.$value;
  }
);
Run Code Online (Sandbox Code Playgroud)

哪个是完全没问题的,直到你调用它为止this.af.auth.logout();.如果您的Firebase安全设置正确,Firebase将抛出错误,因为您不再登录该用户 - 您现在是匿名用户,应该在用户空间内被阻止.由于上述订阅仍然有效,Firebase会告诉您,您无法匿名访问目标用户空间.

因此,必须关闭订阅.你可以做到这一点的方法是,添加

ngOnDestroy(){
  this.name_sub.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)

组件中的某个位置.当您的组件被销毁时,这将关闭您的订阅.不幸的是,这对我来说是不可能的,因为我正在另一个组件中进行注销.我现在这样做的方式是在收到一个值后立即关闭订阅.

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
  }
);
Run Code Online (Sandbox Code Playgroud)

对我来说,这是非常反直觉的.我认为我们需要一种方法来接收价值,而无需永久订阅数据通道,也无需导入其他模块.