Javascript 如何检查firebase文档是否有带值的字段?

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

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

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

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
方法相同的参数