使用flatmap并使用Angular 8和Guard轻敲

使用flatmap并使用Angular 8和Guard轻敲,angular,jwt,nebular,Angular,Jwt,Nebular,我正试图根据我在JWT令牌中收到的有效负载为我的路由创建一个防护。问题是,我有第一个方法(authService.getToken())返回NbJWTAuthToken的可观察值,然后我需要使用token.getPayload()中的标记再次查询,然后检索有效负载 以下是我尝试过但没有成功的方法: @Injectable() export class AdminGuard implements CanActivate { constructor(private authService:

我正试图根据我在JWT令牌中收到的有效负载为我的路由创建一个防护。问题是,我有第一个方法(authService.getToken())返回NbJWTAuthToken的可观察值,然后我需要使用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”操作符,而不是“点击”

@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()方法可以接受可观察的返回类型。 在你的“可观察”中,你使用的是tap操作符,它不返回任何内容(void)。使用map操作符可以返回一个布尔结果(正如您在问题中已经提到的)