У меня особая проблема с 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;
}
}
}
Что произойдет, если вы измените имя пути с '/ map', если проблема прекратится, вы можете определить, что проблема заключается в имени. Я предполагаю, что вы сначала попадаете на запрос получения, если вы его напрямую пингуете?
@ hyper0009 Да, это «решается» простым изменением имени маршрута моего сервера на, например, / maps
Это внутренняя проблема (я думаю) при обслуживании вашего приложения. У вас есть два варианта:
index.html
, чтобы какой бы URL ни был бэкэнд, он всегда будет перенаправлять на базовый URL-адрес приложения, а интерфейс фактически будет читать маршруты соответственно.См. Ссылки на официальную документацию:
РЕДАКТИРОВАТЬ : Если читать более подробно и подробно ваш пост, это кажется немного странным, и я не знаю, является ли мой ответ решением вашей проблемы. Я пока оставлю это так ... может, это поможет. Если нет, я удалю этот ответ.
Привет, Алекс, спасибо за ответ. Мой бэкэнд настроен как в 1. Так что проблема определенно не в этом. Я провел другой тест, и если я остановлю свое приложение angular и просто введу маршруты в моем браузере, все они будут иметь такое точное поведение, поэтому теперь я совершенно уверен, что в моем случае, как описано, угловая маршрутизация обходится. Тогда маршруты предположений должны называться по-другому ..
Итак, насколько мне известно, вы должны использовать HttpClient API для выполнения вызовов на стороне сервера https://angular.io/guide/http, поскольку это рекомендуемый способ связи со стороной сервера.
Как правило, клиентская часть внешнего интерфейса и серверная часть должны храниться отдельно, если вы не пытаетесь создать изоморфное приложение, которое обслуживает контент как на стороне клиента, так и на стороне сервера, что добавляет сложности.
Да, что я делаю, но в этом случае мой браузер действительно выполняет запрос (какой angular должен «предотвращать» в этом случае).
@ Stevin29, что вы имеете в виду под «браузером делает запрос», настроили ли вы запрос на получение на стороне сервера по тому же пути?
Как я объясняю в своем другом комментарии ниже. Я получаю такое же поведение, как описано в вопросе, как только я закрываю свое приложение angular (но позволяю серверу работать) и набираю URL-адреса (любые) маршрутов сервера. И да, тот же путь, что и в угловом приложении. Итак, в приложении angular есть / map, но на сервере также есть маршрут / map (что, как я думал, должно быть в порядке).
Да, именно поэтому я говорю, что поведение на самом деле не поддерживается в angular, поскольку это приложение на стороне клиента, поведение, которое вы ожидаете, является изоморфизмом, вам следует взглянуть на Angular Universal для чего-то в этом роде. @ Stevin29
если возможно, покажите и свой
AuthGuard
.