使用平面图并点击 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 布尔结果(正如您在问题中已经拥有的那样)。
我正在尝试根据我在 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