Angularfire2:注销异常和最佳实践

问题描述 投票:9回答:2

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

angular firebase angularfire
2个回答
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
投票

这很难看,但有效:

signOut(): void {
    this.router.navigate(['/app').then(() => {
      firebase.database().goOffline()      // <=== this eliminates error!
      this.afAuth.auth.signOut()
    })
  }
© www.soinside.com 2019 - 2024. All rights reserved.