Итак, я пытаюсь реализовать базовый 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-адреса. Нужна помощь в решении этой проблемы.