Angular сторож не перенаправляет на указанную c страницу из-за исключения - PullRequest
0 голосов
/ 17 апреля 2020

Итак, я пытаюсь реализовать базовый c охранник:

canActivate(route: ActivatedRouteSnapshot,
          state: RouterStateSnapshot): Observable<boolean> {
return this.userService.isBoardMember().pipe(
  map(data => {
    if (data === false) {
      this.router.navigate(['main']);
      return false;
    }
    return true;
  })
);
}

Метод isBoardMember выглядит следующим образом:

getUserDetails(): Observable<User> {
this.requestUrl = `${configs.bgwssApi}v1/bics/${this.bic}/tcifs/${this.tcif}/users`;
return this.http.get<User>(this.requestUrl).pipe(catchError(this.handleError));
}

isBoardMember(): Observable<boolean> {
return this.getUserDetails().pipe(map(data => {
  return (data.userRole === 'BOARD_MEMBER');
}));
}

handleError метод:

  private handleError(e: HttpErrorResponse) {
let errorMessage = '';
if (e.error instanceof ErrorEvent) {
  // Client side error received
  errorMessage = `Error getting user occurred: ${e.error.message}`;
} else {
  // Server side error received
  errorMessage = `Error getting user from server, code: ${e.status}, message: ${e.message}`;
}
console.error(errorMessage);
return throwError(errorMessage);

}

Проблема в том, что когда getUserDetails http запрос возвращает ошибку 404 (не находит указанного пользователя c), метод isBoardMember ничего не возвращает поэтому моя защита не перенаправляет должным образом на страницу main, как следует - вместо этого она просто загружает пустую страницу без URL-адреса. Нужна помощь в решении этой проблемы.

1 Ответ

1 голос
/ 17 апреля 2020

Вы должны добавить еще catchError, потому что вы вызываете ошибку 404 в вашем handleError методе.

Такое чувство, что isBoardMember - правильное место для этого. Если вы чувствуете, что это должно быть в охране, вы можете добавить туда логи c:

Так что либо в Службе:

isBoardMember(): Observable<boolean> {
  return this.getUserDetails().pipe(
    map(data => data.userRole === 'BOARD_MEMBER'),
    catchError(() => of(false))
  );
}

Или в охране:

constructor(private userService: UserService, private router: Router) {}

canActivate(): Observable<boolean | UrlTree> {
  return this.userService.isBoardMember().pipe(
    catchError(() => of(false)),
    map(data => data || this.router.createUrlTree(['main']))
  );
}

Я использую createUrlTree, потому что это рекомендуемый способ перенаправления с охраны

...