2017-10-10 58 views
2

是否可以取消订阅valueChanges()? 当我的用户登录,我取他们的用户数据这样Firestore:取消订阅valueChanges(用户在注销时获取“丢失的权限”)

this.user$ = this.afAuth.authState.flatMap(authUser => { 
    if (!authUser) { 
    this.user = null; 
    return Observable.of(this.user); 
    } 

    return this.db.doc<UserServerData>(`users/${authUser.uid}`) 
    .valueChanges() 
    .map(user => new User(authUser.uid, user)); 
}); 

当然,我对公司的FireStore规则说,只有与特定的ID的用户可以读取该用户DATAS ... 所以,当用户注销,每个用户id上的规则查询都会失败,并且出现“Missing permissions”错误。

所以这里是我的问题,我该怎么做? 有没有办法取消订阅查询?

非常感谢

回答

1

AngularFire的作者在这里。

您有两种选择。为注销用户返回一个空集或使用路由警卫。

返回空集很容易。将.of(null)替换为空数组。

this.user$ = this.afAuth.authState.switchMap(authUser => { 
    if (!authUser) { 
    this.user = null; 
    return Observable.of(null); 
    } 
    return this.db.doc<UserServerData | null>(`users/${authUser.uid}`) 
    .valueChanges() 
    .map(user => new User(authUser.uid, user)); 
}); 

Using a route guard is a bit more complicated,并要求对@angular/router的依赖。但是,它将确保用户在路由加载之前存在。

+0

嗨大卫。谢谢。为什么我应该返回一个数组,因为我在查询文档而不是集合?无论如何,我已经尝试过它和Typescript编译失败,因为我的Observable期待一个“用户”类型的数据('用户$:Observable '),我试图给他一个空数组。另外我正在使用Ionic,所以我没有角度路由器。由于我在switchMap中,我们确定Firestore查询不是由authState更改触发的吗?再次感谢(Love the Firecasts) – Maslow

+0

好点!我更新它允许空值或用户。这取决于你的模板。我建议使用null抑制运算符(?)来解决此问题。 –

+0

对不起大卫。可悲的是,这并没有解决问题。我们告诉查询它现在可以返回null,但仍然会尝试在'users/UID'处获取用户,所以我们仍然会出现“权限不足或不足”的错误。我认为对'authUser'的检查就足够了,但看起来像在FireMap的连接是在switchMap中进行的。也许这是问题?我是否应该在某处捕获错误以避免运行时错误? – Maslow