Угловая маршрутизация не работает после обновления (угловой маршрут имеет то же имя, что и маршрут сервера)

У меня особая проблема с 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), приложение angular не выбирает маршрут, и вместо этого на сервер отправляется пустой запрос GET, минуя маршрутизацию angular. Итак, yes / map - это угловой маршрут, но он также доступен как запрос на получение на сервере. Этого не происходит, когда я меняю имя маршрута на стороне сервера на другое, поэтому это как-то связано с тем же именем. Я предположил, что сходство имен не должно быть проблемой, поскольку angular должен сначала выбирать эти URL-запросы? Или нет?

пустой запрос на получение: Угловая маршрутизация не работает после обновления (угловой маршрут имеет то же имя, что и маршрут сервера)

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;
     }
  }

}

если возможно, покажите и свой AuthGuard.

miiiii 02.05.2018 13:59

Что произойдет, если вы измените имя пути с '/ map', если проблема прекратится, вы можете определить, что проблема заключается в имени. Я предполагаю, что вы сначала попадаете на запрос получения, если вы его напрямую пингуете?

hyper0009 02.05.2018 14:00

@ hyper0009 Да, это «решается» простым изменением имени маршрута моего сервера на, например, / maps

Stevin29 02.05.2018 14:07
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
3
679
2

Ответы 2

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

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

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

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

Привет, Алекс, спасибо за ответ. Мой бэкэнд настроен как в 1. Так что проблема определенно не в этом. Я провел другой тест, и если я остановлю свое приложение angular и просто введу маршруты в моем браузере, все они будут иметь такое точное поведение, поэтому теперь я совершенно уверен, что в моем случае, как описано, угловая маршрутизация обходится. Тогда маршруты предположений должны называться по-другому ..

Stevin29 02.05.2018 14:30

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

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

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

Stevin29 02.05.2018 14:33

@ Stevin29, что вы имеете в виду под «браузером делает запрос», настроили ли вы запрос на получение на стороне сервера по тому же пути?

hyper0009 02.05.2018 14:36

Как я объясняю в своем другом комментарии ниже. Я получаю такое же поведение, как описано в вопросе, как только я закрываю свое приложение angular (но позволяю серверу работать) и набираю URL-адреса (любые) маршрутов сервера. И да, тот же путь, что и в угловом приложении. Итак, в приложении angular есть / map, но на сервере также есть маршрут / map (что, как я думал, должно быть в порядке).

Stevin29 02.05.2018 14:44

Да, именно поэтому я говорю, что поведение на самом деле не поддерживается в angular, поскольку это приложение на стороне клиента, поведение, которое вы ожидаете, является изоморфизмом, вам следует взглянуть на Angular Universal для чего-то в этом роде. @ Stevin29

hyper0009 02.05.2018 14:56

Другие вопросы по теме