使用flatmap并使用Angular 8和Guard轻敲
我正试图根据我在JWT令牌中收到的有效负载为我的路由创建一个防护。问题是,我有第一个方法(authService.getToken())返回NbJWTAuthToken的可观察值,然后我需要使用token.getPayload()中的标记再次查询,然后检索有效负载 以下是我尝试过但没有成功的方法:使用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:
@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操作符可以返回一个布尔结果(正如您在问题中已经提到的)