Angular 2, как заставить auth guard работать с наблюдаемым

Я пытаюсь внедрить auth guard в один из моих маршрутов, но не могу заставить его работать, так как не знаю, как это сделать с помощью наблюдаемого.

я использую ngrx/store чтобы сохранить мой токен, а затем в гвардии я получаю его с помощью this.store.select('auth'), который выбирает объект, который выглядит следующим образом (если вы вошли в систему):

{
  token: 'atokenstring',
  isAuthenticated: true,
  isPending: false
}

И охранник выглядит так:

export class AuthGuardService implements CanActivate {

  constructor(private router: Router, private store: Store<IStore>) {}

  canActivate(): Observable<any> {

    return this.store.select('auth').let((state: Observable<IAuthStorage>) => state.filter((auth: IAuthStorage) => !auth.isPending && auth.isAuthenticated)).map(
      (auth: IAuthStorage) => {

        if (!auth.isAuthenticated) {
          return this.router.navigateByUrl('admin/login');
        }
        else {
          return true;
        }
      }
    );
  }
}

Теперь проблема в том, что охранник возвращает наблюдаемое, а не логическое значение. Что приводит к тому, что маршрут не отображается, даже если вы попали внутрь else который возвращается true,

Как я могу сделать так, чтобы охранник возвращал логическое значение, а не наблюдаемое?

1 ответ

Решение

Не уверен, что это все еще так, но некоторое время назад что-то подобное требовалось

  canActivate(): Observable<any> {

    return this.store.select('auth').let((state: Observable<IAuthStorage>) => state.filter((auth: IAuthStorage) => !auth.isPending && auth.isAuthenticated)).map(
      (auth: IAuthStorage) => {

        if (!auth.isAuthenticated) {
          return this.router.navigateByUrl('admin/login');
        }
        else {
          return true;
        }
      }
    ).first(); // <<<=== added
  }

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

first должен быть импортирован, чтобы быть доступным.

Другие вопросы по тегам