Угловая маршрутизация автоматически перенаправляет на путь по умолчанию

#angular #angular-routing #angular-router

#угловая #угловая маршрутизация #angular-маршрутизатор

Вопрос:

Это моя конфигурация маршрутизации

 const routes: Routes = [{
  path: '', redirectTo: 'signIn', pathMatch: 'full'
}, {
  path: 'signIn', loadChildren: './sign-in/sign-in.module#SignInModule', canActivate: [AuthGuard]
}, {
  path: 'signUp', canActivate: [AuthGuard], loadChildren: './sign-up/sign-up.module#SignUpModule'
}, {
  path: 'home', canActivate: [AuthGuard], loadChildren: './home/home.module#HomeModule'
}];
  

И моя защита аутентификации

 canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
      return this.webService.getUser().pipe( map(data => {
        if (data['status'] === 1 amp;amp; data['user'] amp;amp; !data['role']) {
          if (state.url === '/signIn' || state.url === '/signUp') {
            console.log('home');
            this.router.navigate(['home']);
          } else {
            console.log('true');
            return true;
          }
        } else {
          sessionStorage.clear();
          if (state.url !== '/signIn' amp;amp; state.url !== '/signUp') {
            this.router.navigate(['signIn']);
          } else {
            return true;
          }
        }
      }));
  }
  

Он загружает каждый путь с помощью ‘signIn’, например, когда я когда-либо хочу посетить ‘home’, он переходит на http://localhost:4200/home/signIn и загружает страницу ‘singIn’, но если я удаляю пустой путь, он загружает ‘home’ страницу правильно. Какой наилучший способ загрузить только домашнюю страницу? Я не хочу добавлять «вход» на каждую страницу. Большое вам спасибо.

Комментарии:

1. Не могли бы вы, пожалуйста, добавить файл AuthGuard ts, о котором идет речь

2. Я добавил свою защиту аутентификации

3. Позвольте мне проверить, что здесь произошло, и вернуться к вам

Ответ №1:

Выполняется маршрутизация по относительному пути. ‘home’. Это означает, что все, что находится в вашем маршруте на момент маршрутизации, останется там.

Вы можете проложить маршрут по абсолютному пути, добавив косую черту (‘/’) перед маршрутом.

 this.router.navigate(['/home']);
  

Ответ №2:

Вам лучше использовать весь маршрут в главном маршруте (пустой один раз), а остальные использовать в «дочерних элементах» этого маршрута, таким образом, вы можете использовать одноразовую защиту для всех в «CanActivateChild» Вашего основного пустого маршрута, вам не нужно защищать, вы направляете этот маршрут к своему компоненту главной страницы, а другие средства защиты автоматически перенаправляют пользователя на страницу «вход».

CanActivateChild гильдия и пример

Комментарии:

1. Настройка интерфейса AuthGuard на таких страницах, как ‘register’, ‘login’, ‘unauthorized’, ‘404’ и т.д., Вряд ли кажется полезной. Проблема OP может быть легко решена без принятия подобных решений.

2. @Carsten хорошо, но использование empty в качестве «перенаправления» по умолчанию не является обычным, и этот тип лучше подходит для организованных маршрутов для продолжения растущего проекта.