Угловая маршрутизация завершается ошибкой после обновления (угловой маршрут совпадает с именем серверного маршрута) - PullRequest
0 голосов
/ 02 мая 2018

У меня есть специфическая проблема с Angular (версия 5), в которой у меня есть несколько маршрутов, настроенных как angular, например:

{path: 'calendar',  canActivate: [AuthGuard], component: ProjectsComponent }
{path: 'map',  canActivate: [AuthGuard], component: MapComponent }

Затем в заголовке моей веб-страницы есть кнопки, которые активируют эти маршруты.

<li routerLinkActive="active"><a [routerLink]="['/calendar']">Kalender</a></li>
<li routerLinkActive="active"><a [routerLink]="['/map']">Kaart</a></li>

Все хорошо для / calendar, но для / map есть проблема. При первом нажатии кнопки / карты загружается компонент, который затем отправляет запрос на получение API сервера для некоторых данных с токеном, отправляемым для аутентификации, не беспокойтесь.

Когда я обновляю (или вручную набираю localhost: 3000 / map), угловое приложение не выбирает маршрут, и вместо этого на сервер отправляется пустой запрос GET в обход угловой маршрутизации. Так что да / карта является угловым маршрутом, но также доступна как запрос на получение на сервере. Такое поведение не происходит, когда я изменяю имя маршрута на стороне сервера на что-то другое, поэтому оно как-то связано с тем же именем. Я предположил, что сходство имен не должно быть проблемой, так как angular должен сначала поднять эти URL-запросы? Или нет?

пустой запрос на получение: enter image description here

AuthGuard (просто проверяет, вошел ли пользователь в клиентскую часть, серверная часть защищена аутентификацией при каждом запросе):

export class AuthGuard implements CanActivate {

  constructor(private authService: AuthService,
              private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

     if (this.authService.isLoggedIn()) {
       return true;
     } else {
        this.router.navigate(['auth', 'login']);
        return false;
     }
  }

}

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Итак, насколько мне известно, вы должны использовать HttpClient API для выполнения вызовов на стороне сервера https://angular.io/guide/http, поскольку это рекомендуемый способ связи со стороной сервера.

Как правило, клиентская сторона и серверная часть внешнего интерфейса должны храниться отдельно, если только вы не пытаетесь создать изоморфное приложение, которое обслуживает контент как на стороне клиента, так и на стороне сервера, что добавляет сложности.

0 голосов
/ 02 мая 2018

Это проблема бэкэнда (я думаю) при обслуживании вашего приложения. У вас есть два варианта здесь:

  1. Сконфигурируйте бэкэнд для перенаправления на index.html все время, так что, какой бы ни был URL-адрес, бэкэнд всегда будет перенаправлять на базовый URL-адрес приложения, и внешний интерфейс будет соответственно читать маршруты.
  2. Используйте механизм определения местоположения Hash от angular, который служит именно этой цели, но вам придется обновить все ваши маршруты в вашем приложении (не рекомендуется).

Смотрите официальные ссылки на документацию:

РЕДАКТИРОВАТЬ: Чтение более подробно и подробно вашего поста кажется странным, и я не знаю, является ли мой ответ решением вашей проблемы. Сейчас я так позволю ... может, это поможет. Если нет, я удалю этот ответ.

...