Есть ли способ перенаправить, если из Guard в Angular при использовании асинхронного метода для проверки?

В моем проекте Angular(6.xx) я внедряю Guard на определенных маршрутах, которые в случае сбоя должны перенаправить на '/ login'. Guard, опирается на асинхронный метод в AuthService для проверки пользователя.

// AuthService
checkLogin(): Observable<boolean> {
  return this.http
    .get<boolean>(`${this.apiUrl}/users/autologin`)
    .pipe(
      map(result => result === true),
      catchError(error => of(false))
    );
}

// AuthGuard
canActivate(next: ActivatedRouteSnapshot, 
  state: RouterStateSnapshot): Observable<boolean> {
    return this.authService.checkLogin();
}

Как мне этого добиться?

Примечание: я знаю, как это сделать, если код в canActivate является синхронным.

Пример кода: https://stackblitz.com/edit/angular-async-guard-redirect?file=src%2Fapp%2Fapp.module.ts

2 ответа

Решение

Вы можете добавить tap в наблюдаемую pipe в AuthGuard, вот так:

return this.authService.checkAuthentication().pipe(
  tap(authenticated => {
    if (!authenticated) {
      // Add your redirect in here
    }
  })
);

Таким образом, вы можете реагировать на Observableзначение, прежде чем вернуть его.

Вы можете изменить authservice, как это.

   // AuthService
checkLogin(): Observable<boolean> {
  return this.http
    .get<boolean>(`${this.apiUrl}/users/autologin`)
    .pipe(
      map(result => { if(result === true)
                        {
                            returrn true;
                        }
                        this.router.navigateByUrl('/login');
                        return false;
                        }),
      catchError(error => of(false))
    );
}
Другие вопросы по тегам