Маршрут к другой странице, основанной на охраннике в угловом 6, асинхронном запросе rxjx 6

Я реализовал функциональность, где я могу получить запрос и контролировать авторизацию страницы, я хочу перенаправить на страницу входа в случае ложного запроса.

public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this.authSer.isAuthenticated().pipe(map((response) => {
            console.log('I ma here');
            if (response.status === 200) {
                return true;
            } else {
                console.log('Error getting data');
                return false;
            }
        }), catchError((error) => of(false))
    );
}

Как я могу проложить маршрут к странице входа отсюда? Я использую угловой 6

2 ответа

Я знаю, что в вопросе конкретно говорится о Angular 6, я просто хочу упомянуть, что с Angular 7.1 вы можете вернуть UrlTree или логическое значение из вашей охраны - а также Promise а также Observable эквиваленты -, и это будет служить автоматическим перенаправлением. Итак, в вашем случае:

public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  return this.authSer.isAuthenticated().pipe(
    map((response) => {
      console.log('I ma here');
      if (response.status === 200) {
        return true;
      } else {
        console.log('Error getting data');
        return false;
      }
    }),
    catchError((error) => of(false)),
    map(responseOk => {
      // Isolate dealing with true/false results since they can come from different opperators
      if (!responseOk) {
        return this.router.createUrlTree(['path', 'to', 'redirect'])
      }
      // alternatively, return a different UrlTree if you feel like it would be a good idea
      return responseOk
    })
  );
}

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

Вот пример охраны с редиректом на URL. Может быть, это поможет:

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

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if (this.authService.isAuth) {
        return true;
    }
    else {
        this.router.navigate([state.url]); // or some other url
    }
}}
Другие вопросы по тегам