Как обрабатывать несанкционированные запросы (статус с 401 или 403) с новым httpClient в angular

у меня есть охрана на моей домашней странице, как показано ниже. checkTokenValidation — это метод проверки токена с сервера. когда ответ сервера false , мой код, кажется, останавливается, и все внутри map больше не работает.

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    return this.authService.checkTokenValidation().pipe(
      map((data) => {
          if (data['ok']) {
            this.router.navigate(['/overview']);
            return false;
          } else {
            return true;
          }
        },
        (error: string) => {
          console.log(error);
        })
    );
  }

вот мой код checkTokenValidation:

 checkTokenValidation() {
 const token = this.getToken();
    return this.httpClient.get('http://185.69.54.21/back_end/web/site/check-token', {
      headers: new HttpHeaders().append('Authorization', `Bearer ${token}`)
    });
  }

person Mohandes    schedule 20.10.2018    source источник
comment
используйте подписку вместо канала и карты, httclient возвращает наблюдаемое, поэтому подпишитесь на него, чтобы обработать ответ или ошибку   -  person stackMonk    schedule 20.10.2018
comment
я не могу использовать подписку, потому что canActivate не возвращает значение подписки.   -  person Mohandes    schedule 20.10.2018
comment
Метод checkTokenValidation возвращает ответ из метода get httpclient, который возвращает наблюдаемое, поэтому вы можете подписаться на него.   -  person stackMonk    schedule 20.10.2018


Ответы (1)


вопросы

Подозреваемые проблемы:

  1. Навигация через гвардию. Так что лучше удалить оттуда.

  2. Состояние неправильное, я думаю. Если данные в порядке, они должны вернуть true, иначе false;

  3. В случае ошибки вернуть false;

Модифицированный код

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    return this.authService.checkTokenValidation().pipe(
      map((data) => {
          if (data['ok']) {
            //this.router.navigate(['/overview']); //<-- remove this.
            return true; //<- return true if response is ok
          } else {
            return false;  //<- return false if response is not ok
          }
        },
        (error: string) => {
          console.log(error);
          return false;   //<- return false in case of error
        })
    );
  }
person Sunil Singh    schedule 20.10.2018