1

我是 Angular 7 的新手,面临一个我无法弄清楚为什么会发生的问题。

我希望在每次重定向之后RouteGuard都会检查令牌是否有效。为此,我编写了以下服务;

 getUserClaims():Promise<any> {
    /*return new Promise((resolve, reject) => {
      this._http.get(ALCA_Utility.API_BASE_URL + 'User/GetCurrentUser')
        .toPromise()
        .then(
          res => { // Success

            resolve(res)
          }
        );
    });*/

     return this._http.get(ALCA_Utility.API_BASE_URL + 'User/GetCurrentUser')
       .toPromise();
  }

我尝试了这两种方法,(我注释掉了上面的方法,还HTTP_INTERCEPTORS用来拦截 HTTP 调用并在 Authorization 标头中添加令牌)

canActive方法如下;

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean {

    if (sessionStorage.getItem('userToken') != null) {

      this._auth.getUserClaims().then((data) => {
        if (data.PK_UserID != null && data.PK_UserID > 0) {
          alert(1)

          return true
        }
        else{
          alert(2)      
          return false
        }
        alert(3)      

      })
      alert(4)      
    }
    else {      
      this._router.navigate(['/login']);
      return false;
    }
  }

我认为这些方法将按顺序执行canActive,但是,它显示警报 4,然后是 1、2、3。

我不明白为什么会这样?

4

2 回答 2

0

当您在承诺中执行 http.get 时,这是一个异步调用。对我来说,这是正常的,您首先看到 4 个,然后是其余的。你得到一个“承诺”,在某个时间你可能会或可能不会从电话中得到答复。在您的程序中,我真的没有看到需要警报 4. 您唯一能做的就是捕捉错误

于 2019-02-23T20:31:09.570 回答
0

请检查以下实现:

@Injectable()
export class LoggedInGuard implements CanActivate {

  constructor(private router: Router) {  }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return userService.isAuthenticated().then(result => {
      if (result) return true;
      UserLoginService.setPreviousUrl(state.url);
      this.router.navigate(['login']);

      return false;
    }).catch(message => {
      userService.setPreviousUrl(state.url);
      this.router.navigate(['login']);

      return false;
    });
  }
}

对于您的情况,请检查以下内容:

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {
    if (sessionStorage.getItem('userToken') != null) {
      return this._auth.getUserClaims().then(data => {
        if (data.PK_UserID != null && data.PK_UserID > 0) {
          return true;
        } else {
          return false;
        }
      });
    } else {
      this._router.navigate(['/login']);
      return false;
    }
  }

请注意canActivate的返回类型

Promise<boolean> | boolean
于 2019-02-23T20:32:16.643 回答