在我的Angular 4应用程序中,我正在开发一个誓言警卫服务。在那里,我想检查令牌是否有效,如果没有,用户需要再次登录。
以下是我用来实现我想要的功能:
isLogedIn(){
return this.http.get(this.baseUrl+"/check-token?token="+this.currentUser.token).map(res => res.json())
.subscribe(response => {
let logedinUser = JSON.parse(localStorage.getItem('currentUser'));
if(response.message == "_successful" && localStorage.getItem("currentUser") != null){
return true;
}else{
return false;
}
},err =>{
console.log(err);
return false;
});
}
但事情是在auth gurd函数中我无法获得此函数的确切输出值。贝娄是我的autur gurd功能:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
console.log(this.userService.isLogedIn());
if (this.userService.isLogedIn()) {
return true;
} else {
this.router.navigate(['/login'], {
queryParams: {
return: state.url // curent url as a parameter to the login page
}
});
return false;
}
}
当我使用console.log(this.userService.isLogedIn());
时,它会打印订阅者对象而不是返回值。如何从isLogedIn()函数返回值?
答案 0 :(得分:1)
因为您确实要退回订阅。 `
this.http.get(...)
是Observable
; this.http.get(...).map(...)
是Observable
; this.http.get(...).map(...).subscribe(...)
是Subscription
; subscribe
方法返回Subscription
,而不是return something
例程内的subscribe
。
我建议您:在守卫中返回观察者本身(canActivate
接受Observable<boolean>
作为回报)。请勿在{{1}}致电subscribe
:
isLogedIn()
注意我调用isLogedIn(): Observable<boolean>{
return this.http.get(this.baseUrl+"/check-token?token="+this.currentUser.token).map(res => res.json())
.map(response => {
let logedinUser = JSON.parse(localStorage.getItem('currentUser'));
if(response.message == "_successful" && localStorage.getItem("currentUser") != null){
return true;
}else{
return false;
}
});
}
两次:最后一个是操纵你的响应以返回一个布尔值。最后,在map
:
canActivate
我插入了操作符do
,这是一个独立的回调,用于管理您的路由。
答案 1 :(得分:0)
你的功能应该是
isLogedIn(): Observable<boolean> {
return this.http.get(this.baseUrl + '/check-token?token=' + this.currentUser.token)
.map((res: Response) => {
const response = res.json();
return response.message == "_successful" && localStorage.getItem("currentUser") != null;
}).catch((error: Response) => {
return false;
});
}