【问题标题】:Firestore: Unsubscribe from valueChanges (user gets "Missing permissions" when signing out)Firestore:取消订阅 valueChanges(用户在退出时获得“缺少权限”)
【发布时间】:2018-03-22 02:18:46
【问题描述】:

是否可以取消订阅 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 的用户才能读取此用户数据... 因此,当用户退出时,每个带有用户 ID 规则的查询都会失败,并且我会收到“缺少权限”错误。

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

非常感谢

【问题讨论】:

    标签: angular firebase angularfire2 google-cloud-firestore


    【解决方案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 的依赖。但是,它将确保用户在路由加载之前存在。

    【讨论】:

    • 嗨,大卫。谢谢。为什么我要返回一个数组,因为我正在查询一个文档,而不是一个集合?无论如何,我已经尝试过了,Typescript 编译失败,因为我的 Observable 期待“用户”类型的数据 (user$: Observable&lt;User&gt;),我试图给他一个空数组。我也在使用 Ionic,所以我没有角度路由器。由于我在 switchMap 中,我们确定 Firestore 查询不是由 authState 更改触发的吗?再次感谢(爱 Firecasts)
    • 好点!我更新了它以允许空值或用户。但是,这取决于您的模板。我建议使用空抑制运算符 (?) 来解决此问题。
    • 对不起,大卫。可悲的是,这并不能解决问题。我们告诉查询它现在可以返回 null,但它仍然会尝试在 users/UID 处获取用户,所以我们仍然会收到“缺少权限或权限不足”错误。我认为检查authUser 就足够了,但看起来与Firestore 的连接无论如何都是在switchMap 中建立的。也许这就是问题?我应该在某处捕获错误以避免运行时错误吗?
    • 我的错。它适用于 switchMap。我没有注意到我使用的是 flatMap 而您在示例中使用的是 switchMap。非常感谢
    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 2019-01-29
    • 2020-01-25
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多