【问题标题】:How to check if a firebase document has a field with value?如何检查firebase文档是否有一个有价值的字段?
【发布时间】:2020-08-11 13:16:48
【问题描述】:

我正忙于学习 Angular + Firebase,但遇到了一个问题。我有一组用户和一个角色。我正在使用为用户生成的 ID 来存储我的角色数据。截图如下:

我想使用 canActivate 函数来管理谁可以编辑什么数据。如何检查用户是否将 admin 字段设置为 true?我可以通过以下方式获取用户的角色文档:

this.afs.collection('roles').doc(id).valueChanges()

我可以像这样在 HTML 中显示数据:

*ngIf="roles$ | async as roles"

但是,我想用它来验证用户是否具有管理员权限。

【问题讨论】:

    标签: javascript angular firebase google-cloud-firestore angularfire2


    【解决方案1】:

    您必须使用 take(1)first() 运算符才能仅从 firebase 流中获取第一个发射。 CanActivate 守卫期望完成 Observable:

    export interface UserRoles {
      admin: boolean;
      editor: boolean;
      subscriber: boolean;
    }
    
    @Injectable({
      providedIn: 'root'
    })
    export class IsAdminGuard implements CanActivate {
      constructor(private auth: AngularFireAuth, private afs: AngularFirestore) {}
    
      canActivate(): Observable<boolean> {
        return this.auth.user.pipe(
          switchMap((user) => !user?.uid
            ? of(false)
            : this.afs.doc<UserRoles>(`roles/${user.uid}`).valueChanges().pipe(
                map((roles) => !!(roles?.admin))
              )
          ),
          take(1)
        );
      }
    }
    

    【讨论】:

    • 当我实现这个时,我得到以下错误:属性 'admin' 在类型 'unknown' 上不存在。
    • 我有一个后续问题。该代码可以阻止不需要的用户,但是如果布尔值为 false,我该如何重定向它们?
    • @user1303840 你返回一个Observable&lt;UrlTree[]&gt;,你可以通过在你的守卫中注入路由器并使用router.createUrlTree方法来创建它,它采用与navigate方法相同的参数跨度>
    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多