может активировать защиту маршрута angular не может удовлетворить интерфейс при выполнении логики

У меня есть следующие возможности активировать класс защиты маршрута

import {OnDestroy } from '@angular/core';
import {
  CanActivate,
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
  Router
} from '@angular/router';
import {Injectable} from '@angular/core';
import {UserAuthorizationService} from "../userauthorizationservice/userauthorizationservice";


@Injectable()
export class ClientSuitsUserGuard implements CanActivate, OnDestroy{
  constructor(private userservice: UserAuthorizationService, private router: Router){}
  userservicesubscription;
  user ={
    id: null,
    isclient: false,
    issuitsviewer: false,
    issuitsadministrator: false,
    issuitssuperuser: false,
    isvenueuser: false

  };

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

    this.userservicesubscription = this.userservice.receiveuser()
      .subscribe(
        (req: any)=>{
          if(req != null){
            this.user = req;
            if(this.user.isclient || this.user.issuitsviewer || this.user.issuitssuperuser || this.user.issuitsadministrator){
              return true;
            }
            if(this.user == null ){
              this.router.navigate(['/signin']);
              return false;
            }else{
              this.router.navigate(['/401']);
              return false;
            }
          }
          this.router.navigate(['/signin']);
          return false;
        }
      );
  }

  ngOnDestroy(){
    this.userservicesubscription.unsubscribe();
  }
}

И я все время получаю ошибку:

ОШИБКА в /home/rickus/Documents/softwareProjects/211hospitality/suitsandtables/frontend/suitsandtables/src/app/services/uservice/authguardservices/isclientuserguard.ts (31,44): функция, объявленный тип которой не является ни void, ни any 'должен возвращать значение.

Я хочу, чтобы охранник маршрута получал проверку прав пользователя, истинны ли атрибуты или нет, и перенаправлял на страницы в зависимости от того, являются ли условия ложными или истинными.

Я чувствую, что мой код правильный, и это проблема интерфейса. Могу ли я сделать какие-нибудь быстрые настройки, чтобы удовлетворить интерфейс?

Что я делаю неправильно?

Я внес следующие изменения на основе приведенного ниже ответа, но теперь мне приходится иметь дело с новой ошибкой из-за этого.

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

    return this.userservicesubscription = this.userservice.receiveuser()
      .map(
        (req: any)=>{
          if(req != null){
            this.user = req;
            if(this.user.isclient || this.user.issuitsviewer || this.user.issuitssuperuser || this.user.issuitsadministrator){
              return true;
            }
            if(this.user == null ){
              this.router.navigate(['/signin']);
              return false;
            }else{
              this.router.navigate(['/401']);
              return false;
            }
          }
          this.router.navigate(['/signin']);
          return false;
        }
      );
  }

с новой ошибкой во время выполнения:

ERROR Error: Uncaught (in promise): TypeError: this.userservice.receiveuser(...).map is not a function
TypeError: this.userservice.receiveuser(...).map is not a function

person Community    schedule 09.05.2018    source источник
comment
Операторы возврата в методе subscribe не возвращают значения для вашего метода canActivate. Вместо подписки вы захотите использовать метод map и вернуть эту наблюдаемую цепочку (обновив результат возврата до Observable<boolean>).   -  person Daniel W Strimpel    schedule 10.05.2018
comment
@DanielWStrimpel Есть идеи, как исправить? Я не совсем уверен, как с этим двигаться дальше.   -  person    schedule 10.05.2018
comment
@DanielWStrimpel, не могли бы вы написать ответ ниже? Так что я могу дать вам очки и полностью понять, что вы говорите, пожалуйста   -  person    schedule 10.05.2018


Ответы (1)


Как указано в моем комментарии выше:

Ваши операторы return в методе подписки не возвращают значения для вашего метода canActivate. Вместо подписки вы захотите использовать метод map и вернуть эту наблюдаемую цепочку (обновив результат возврата до Observable).

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
  return this.userservice.receiveuser().map(
    (req: any)=>{
      if(req != null){
        this.user = req;
        if(this.user.isclient || this.user.issuitsviewer || this.user.issuitssuperuser || this.user.issuitsadministrator){
          return true;
        }
        if(this.user == null ){
          this.router.navigate(['/signin']);
          return false;
        }else{
          this.router.navigate(['/401']);
          return false;
        }
      }
      this.router.navigate(['/signin']);
      return false;
    }
  );
}
person Daniel W Strimpel    schedule 09.05.2018
comment
хорошо, поэтому карта позволяет наблюдаемому изменять свою область действия в области действия функции, а не подписки. Верный? В этом есть смысл! - person ; 10.05.2018
comment
У меня возникла новая проблема A function whose declared type is neither 'void' nor 'any' must return a value., это, скорее всего, связано с тем, что я не выполняю вторую часть вашего ответа. Я не уверен, как бы превратить карту в наблюдаемое. Вы можете закончить иллюстрировать свой ответ? - person ; 10.05.2018
comment
Я думаю, вам не хватает некоторых путей возврата в вашем почтовом методе (например, если req == null). - person Daniel W Strimpel; 10.05.2018
comment
давай посмотрим, проверим - person ; 10.05.2018
comment
Метод карты отображает ответ от вашего receiveUser() вызова на логическое значение. Он вернет наблюдаемое. - person Daniel W Strimpel; 10.05.2018
comment
нет, похоже, все они вернулись должным образом. Я попытался подписаться на карту, но это тоже не сработало - person ; 10.05.2018
comment
поэтому я должен возвращать наблюдаемое логическое значение, а не только логическое? Я собираюсь попробовать - person ; 10.05.2018
comment
Да не подписывайтесь. Вы этого не хотите. Вы возвращаете результат карты, как показано? - person Daniel W Strimpel; 10.05.2018
comment
Я не был! Я только что вернулся, давайте посмотрим сейчас! - person ; 10.05.2018
comment
поэтому я отредактировал ваш ответ, включив в него изменения, которые я хотел бы изменить для своего вопроса. Я делаю это сейчас. сделал ошибку, но дело в том, что теперь у меня возникает ошибка времени выполнения, когда я пытаюсь получить доступ к защищенному URL-адресу - person ; 10.05.2018
comment
Вам нужно будет импортировать наблюдаемый оператор. import 'rxjs/add/operator/map'; - person Daniel W Strimpel; 10.05.2018
comment
разве это не так? импортировать {Observable} из 'rxjs / Observable'; Разве мне нужно импортировать карту? это то, что вы имели ввиду? - person ; 10.05.2018
comment
ОК, импортировал то, что вы меня просили, и это сработало. похоже, моя логика все еще отключена. Проверяю это - person ; 10.05.2018
comment
Импорт наблюдаемого в том виде, в каком он у вас есть, просто импортирует наблюдаемое без операторов. Вы должны импортировать их индивидуально - person Daniel W Strimpel; 10.05.2018
comment
о, хорошо, я понял !! - person ; 10.05.2018