如何检查 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)
);
}
}
我正忙于学习 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)
);
}
}