如何检查 Firebase 文档是否具有值字段?

How to check if a firebase document has a field with value?

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

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

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

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

*ngIf="roles$ | async as roles"

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

您将必须使用 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)
    );
  }
}