使用平面图并点击 Angular 8 和 Guard

Working with flatmap and tap with Angular 8 and Guard

我正在尝试根据我在 JWT 令牌中收到的有效负载为我的路由创建一个守卫。问题是我有第一个方法 (authService.getToken()) 返回 NbJWTAuthToken 的 Observable,然后我需要使用 token.getPayload() 中的令牌再次查询,然后检索有效负载。

这是我尝试过但没有成功的方法:

@Injectable()
export class AdminGuard implements CanActivate {
    constructor(private authService: NbAuthService) { }

    canActivate() {

        return this.authService.getToken()
           .pipe(
               flatmap(token => token.getPayload()),
               tap((account:Account) => account.type === AccountType.ADMIN)
           );
    }
}

有什么想法吗?

你们非常接近。只需使用 Rxjs 'map' 运算符而不是 'tap'.

@Injectable()
export class AdminGuard implements CanActivate {
  constructor(private authService: NbAuthService) { }

  canActivate() {
    return this.authService.getToken()
      .pipe(
        flatmap(token => token.getPayload()),
        map((account:Account) => account.type === AccountType.ADMIN)
      );
  }
}

说明

canActivate() 方法可以接受 return 类型的 Observable。 在您的 Observable 中,您使用的是 tap 运算符 return 什么都没有(无效)。使用地图运算符,您可以 return 布尔结果(正如您在问题中已经拥有的那样)。