我创建了一个简单的AuthGuard来验证令牌,并返回一个真/假响应。 API服务器(Express)和Auth服务工作正常,但if (this.isValid())
发生了一些错误,因为无论如何,用户总是被重定向到登录。
export class AuthGuard implements CanActivate {
constructor(private router: Router,
private _authService: AuthService) { }
canActivate() {
if (this.isValid()) {
return true;
} else {
// not logged in so redirect to login page
this.router.navigate(['/login']);
return false;
}
}
isValid(): boolean {
let isValid = false;
if (localStorage.getItem('currentUser')) {
this._authService.verifyToken().subscribe(validToken => {
isValid = validToken === true;
});
}
console.log(isValid);
return isValid;
}
}
isValid
函数中的哪个位置导致此问题?
答案 0 :(得分:1)
您始终会从false
收到isValid
,因为this._authService.verifyToken()
是异步操作。当数据从api点到达时,将执行异步操作订阅回调。因此它将执行
console.log(isValid);
return isValid;
在订阅回调之前。
您可以在订阅中移动逻辑:
isValid(): any{
let isValid = false;
if (localStorage.getItem('currentUser')) {
this._authService.verifyToken().subscribe(validToken => {
isValid = validToken === true;
console.log(isValid);
return isValid;
});
}
}
有关详情:How do I return the response from an Observable/http/async call in angular2?