Есть ли способ перенаправить, если из 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))
);
}