Угловой охранник маршрута не вызывает возврат

У меня есть класс авторизации, настроенный следующим образом:

export class AuthService {
  user = new Subject<string>();

  login(name: string) {
    this.user.next(name);
  }

}

У меня есть защита авторизации, настроенная для проверки того, имеет ли моя тема пользователя такое значение:

export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    return this.authService.user
      .pipe(
        map(user => {
          const isAuth = !!user;
          if (isAuth) {
            return true;
          }
          return this.router.createUrlTree(['/login']);
        })
      );
  }
}

Я помещаю операторы печати в возврат, и они никогда не вызываются. Страница никогда не загружается и никогда не перенаправляется. Если я просто возвращаю true или false, это работает, но, возвращая мой authService.user, похоже, ничего не происходит.


person Martheli    schedule 14.11.2019    source источник
comment
Не могли бы вы опубликовать весь контент вашего караула?   -  person Rafi Henig    schedule 14.11.2019
comment
@RafiHenig Я обновил свой вопрос, указав полный класс.   -  person Martheli    schedule 14.11.2019
comment
авторизация всегда ложна, почему вы используете const isAuth = !!user; !!user   -  person Chanaka Weerasinghe    schedule 14.11.2019


Ответы (1)


По-видимому, проблема с вашим текущим кодом заключается в том, что никакая часть вашего приложения не передает какие-либо данные в user subject при подписке на него в вашей защите.

Как насчет использования BehaviorSubect, чтобы всякий раз, когда вы подписываетесь на него, вы принимали значение ? используя BehaviorSubect, если вы не введете в него новое значение, вы сразу же примете начальное значение при подписке на него.

export class AuthService {
   user = new BehaviorSubject<string>(null);

   login(name: string) {
     this.user.next(name);
   }
}
person Rafi Henig    schedule 14.11.2019
comment
Я подписываюсь и читаю это значение в другом компоненте без каких-либо проблем, поэтому тема заполняется правильно. - person Martheli; 14.11.2019
comment
Что вы получаете в карте при отладке? - person Rafi Henig; 14.11.2019
comment
Если я добавлю журнал консоли на карту, он никогда не будет вызван. - person Martheli; 14.11.2019
comment
Попробуйте BehaviorSubect, так как он содержит старое значение, в отличие от обычной темы, где вы получаете значение, только если вы были подписаны на него, когда ему было отправлено новое значение. - person Rafi Henig; 14.11.2019
comment
Я согласен, попробуйте BehaviorSubject или ReplaySubject. Субъект будет выдавать только НОВЫЕ значения, но если вы подпишетесь на него, он НЕ будет выдавать никаких существующих значений. - person Damian C; 14.11.2019