Rxjs 使用switchmap操作符激活带有嵌套观测值的routeguard只能在浏览器中工作

Rxjs 使用switchmap操作符激活带有嵌套观测值的routeguard只能在浏览器中工作,rxjs,operators,angular8,canactivate,angular-route-guards,Rxjs,Operators,Angular8,Canactivate,Angular Route Guards,我正在使用带有身份验证和firestore的firebase。通过身份验证的用户在注册时存储在数据库中,其中一些用户具有“管理员”角色。我想保护管理路由,我使用canActivate路由保护。在canActivate函数中,我使用了2个观察值。第一个1获取登录用户并嵌套在另一个observable中,该observable从firestore获取保存的用户,如果登录用户是否为admin,则使用cehck中的信息。问题是,当浏览器在浏览器中键入路由类型后刷新时,routeguard可以正常工作,但

我正在使用带有身份验证和firestore的firebase。通过身份验证的用户在注册时存储在数据库中,其中一些用户具有“管理员”角色。我想保护管理路由,我使用canActivate路由保护。在canActivate函数中,我使用了2个观察值。第一个1获取登录用户并嵌套在另一个observable中,该observable从firestore获取保存的用户,如果登录用户是否为admin,则使用cehck中的信息。问题是,当浏览器在浏览器中键入路由类型后刷新时,routeguard可以正常工作,但当使用按钮上的routerlink调用路由时,什么也不会发生

尝试过使用不和谐的值,但这些值只起作用一次,并且在导航后停止工作

canActivate功能:

//检查角色并返回true或false(userArr是可观察的用户数组,用于存储firestore中的用户)

getRole(uid:string):可观察{
返回此.userArr.pipe(映射(用户=>{
返回users.filter(用户=>{
如果(user.uid==uid){
返回用户
}
})[0]。角色。包括('admin')
}))
因此,只有当我在浏览器中键入路径,并且浏览器在加载路由时刷新时,此功能才起作用。当我单击“管理”按钮导航到“管理”页面时(不使用routerLink或router.navigate(..)),此功能不起作用

我已经设法解决了这个问题,但我仍然不确定以前的实现为什么不起作用..firebase有时是wierd。因此我制作了一个新的observable,从firestore获取用户,并直接在can activate函数中转换输出,见图。
之前,我得到了用户,对其进行了转换,并从canactivate函数调用了转换后的observable,该函数似乎不起作用。因此,数据流出现了问题。

尝试添加一个
first()
到可观察管道,以确保可观察管道完成。如果这是您的意思:返回this.afAuth.getStateOnly().pipe(switchMap(user=>{return this.db.getRole(user.uid)}),first())仍然不好
canActivate(router: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    return this.afAuth.getStateOnly().pipe(switchMap(user => { return this.db.getRole(user.uid) }))

  }
 getStateOnly() {
    return this.afAuth.authState 
  }
getRole(uid: string): Observable<boolean> {
    return this.userArr.pipe(map(users => {
      return users.filter(user => {
        if (user.uid === uid) {
          return user
        }
      })[0].roles.includes('admin')
    }))