在我的Angular / Firebase应用中,我有一个支持登录和注销的用户服务。登录后,我从Angular数据库中检索用户的特定于应用程序的数据。该服务发布一个名为appUser$
的可观察对象,其中包含当前用户对象(如果没有人登录,则为null
)。事情看起来像这样。当用户登录并退出时,我正在使用switchMap
在应用的用户数据的不同观察值之间切换。
constructor(
private angularFireAuth: AngularFireAuth,
private angularFireDatabase: AngularFireDatabase
) {
this.appUser$ = this.angularFireAuth.authState
.map(user => user && user.uid)
.switchMap(uid => uid ? this.angularFireDatabase.object(`/users/${uid}`) :
Observable.of(null);
}
signOut() { return this.angularFireAuth.auth.signOut(); }
问题在于即将发生签名,访问数据库中/users
节点的权限将丢失,从而生成权限被拒绝的运行时错误。为了解决这个问题,我尝试为Angular Subject
创建自己的User
,并在调用signOut
之前将其归零。我认为这会触发switchMap
并以某种方式取消先前用户的应用数据可观察的待处理对象,从而防止权限被拒绝错误。
user$: Subject;
constructor(
private angularFireAuth: AngularFireAuth,
private angularFireDatabase: AngularFireDatabase
) {
this.angularFireAuth.authState.subscribe(this.user$);
this.appUuser$ = this.user$
.map(user => user || user.uid)
.switchMap(uid => uid ? this.angularFireDatabase.object(`/users/${uid}`) :
Observable.of(null);
}
signOut() {
this.user$.next(null);
return this.angularFireAuth.auth.signOut();
}
但即使我将呼叫延迟到signOut
,相同的权限问题仍然存在。即使在this.angularFireDatabase.object
切换到switchMap
后,Observable.of(null)
创建的observable似乎仍然“活着”,而Firebase仍然不满意失去访问它的权限
我可能会以某种方式陷阱或抑制此错误,但是有一些简单的方法来处理这种情况吗?