Guard всегда перенаправляет на маршрут по умолчанию

У меня есть охранник, который проверяет сеанс пользователя. Я создаю наблюдаемое из обещания и возвращаю это наблюдаемое.

К сожалению, маршрутизатор всегда перенаправляет меня на домашнюю страницу при обновлении. Я предполагаю, что это связано с наблюдаемым, так как когда я просто перемещаюсь, он вводит if и возвращает Observalbe.of (true), который работает.

@Injectable()
export default class SessionGuard implements CanActivate {

  constructor(private authService: AuthService) {}

  public canActivate(): Observable<boolean> | Promise<boolean> | boolean {
    if (this.authService.hasSessionChecked) {
      return Observable.of(true).take(1);
    }

    const obs = Observable.fromPromise(this.authService.getSession());
    return obs.map((session) => {
      this.authService.setUserSession(session);
      return true;
    }).take(1);
  }
}

Я попытался заменить наблюдаемое "верным истиной", и все работает как ожидалось.

Есть идеи? Спасибо!

3 ответа

Решение

Это не работает, потому что canActivate должен вернуть логическое значение.

Почему вы хотите использовать Observable?

Как предложил @trichetriche, я заменил наблюдаемое обещанием и вернул его.

Теперь он отлично работает.

return this.authService.getSession().then(
  data => {
    this.authService.setUserSession(data);
    return true;
  },
  err => false,
);

Во-первых, определение canActivate является следующим:

export interface CanActivate {
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}

Поэтому вы должны добавить параметры в функцию.

Во-вторых, если вы собираетесь возвращать наблюдаемую и только наблюдаемую, то измените тип возврата на просто наблюдаемый. Если вам нужен микс, вы можете оставить более одного типа возврата.

В-третьих, удалите оператор take() и рефакторинг охранника, чтобы он выглядел так:

@Injectable()
export default class SessionGuard implements CanActivate {

  constructor(private authService: AuthService) {}

  public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
    if (this.authService.hasSessionChecked) {
      return true;
    }
    const obs = Observable.fromPromise(this.authService.getSession());
    return obs.map(session => {
      this.authService.setUserSession(session);
      return true;
    });
  }
}
Другие вопросы по тегам