Javascript 如何检查firebase文档是否有带值的字段?
我正忙于学习Angular+Firebase,遇到了一个问题。我有一组用户和一组角色。我正在使用为用户生成的ID来存储我的角色数据。以下是一个屏幕截图: 我想使用canActivate功能来管理谁可以编辑哪些数据。如何检查用户是否将admin字段设置为true?我可以通过以下方式获取用户的角色文档:Javascript 如何检查firebase文档是否有带值的字段?,javascript,angular,firebase,google-cloud-firestore,angularfire2,Javascript,Angular,Firebase,Google Cloud Firestore,Angularfire2,我正忙于学习Angular+Firebase,遇到了一个问题。我有一组用户和一组角色。我正在使用为用户生成的ID来存储我的角色数据。以下是一个屏幕截图: 我想使用canActivate功能来管理谁可以编辑哪些数据。如何检查用户是否将admin字段设置为true?我可以通过以下方式获取用户的角色文档: this.afs.collection('roles').doc(id).valueChanges() 我可以用HTML显示数据,如下所示: *ngIf="roles$ | async
this.afs.collection('roles').doc(id).valueChanges()
我可以用HTML显示数据,如下所示:
*ngIf="roles$ | async as roles"
但是,我想用它来验证用户是否具有管理员权限。您必须使用
take(1)
或first()
操作符才能从firebase流中获取第一次发射。CanActivate
防护需要一个完整的可观察的:
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)
);
}
}
导出接口用户角色{
管理员:布尔;
编辑:布尔;
订户:布尔;
}
@注射的({
providedIn:'根'
})
导出类IsAdminGuard实现了CanActivate{
构造函数(私有身份验证:AngularFireAuth,私有afs:AngularFirestore){}
canActivate():可观察的{
返回this.auth.user.pipe(
开关映射((用户)=>!用户?.uid
?属于(假)
:this.afs.doc(`roles/${user.uid}`).valueChanges().pipe(
映射((角色)=>!!(角色?.admin))
)
),
采取(1)
);
}
}
您必须使用take(1)
或first()
操作符才能从firebase流中获取第一次发射。CanActivate
防护需要一个完整的可观察的:
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)
);
}
}
导出接口用户角色{
管理员:布尔;
编辑:布尔;
订户:布尔;
}
@注射的({
providedIn:'根'
})
导出类IsAdminGuard实现了CanActivate{
构造函数(私有身份验证:AngularFireAuth,私有afs:AngularFirestore){}
canActivate():可观察的{
返回this.auth.user.pipe(
开关映射((用户)=>!用户?.uid
?属于(假)
:this.afs.doc(`roles/${user.uid}`).valueChanges().pipe(
映射((角色)=>!!(角色?.admin))
)
),
采取(1)
);
}
}
当我实现此功能时,出现以下错误:类型“unknown”上不存在属性“admin”。我有一个后续问题。代码可以阻止不需要的用户,但是如果布尔值为false,我如何重定向他们?@user1303840您返回一个可观察的,您可以通过将路由器注入您的保护并使用router.createUrlTree
方法来创建它,该方法采用与导航
方法相同的参数,我收到以下错误:类型“未知”上不存在属性“admin”。我有一个后续问题。代码可以阻止不需要的用户,但是如果布尔值为false,我如何重定向他们?@user1303840您返回一个可观察的,您可以通过将路由器注入您的保护并使用router.createUrlTree
方法来创建它,该方法采用与navigate
方法相同的参数