Angular 2: открыть в новой вкладке и сохранить URL-адрес запроса

мы используем приложение Angular 2 с Typescript. Сервер представляет собой облегченный NancyFX (C#), который настроен на ответ с перенаправлением на «/», если выполняется неизвестный вызов API.

Итак, что мы пытаемся сделать: приложение запущено, пользователь вошел в систему. Теперь он хочет открыть вторую вкладку, что делается с помощью «открыть ссылку в новой вкладке» или с помощью CTRL+Click.

Приложение снова открывается в новой вкладке с каким-то URL-адресом маршрута (например, «/order/5»). Сервер отвечает перенаправлением на «/» (базовый угловой маршрут), приложение запускается, загружает весь угловой материал, перенаправляется на базовый маршрут и проверяет, доступен ли токен для пользователя, и если да, то -> он должен перенаправить на URL-адрес исходного запроса

Проблема: Исходный URL-запрос ("/order/5") пропал, так как сервер перенаправляет только на "/".

Есть ли ЛЮБАЯ возможность сохранить URL-адрес (например, в локальном хранилище), чтобы клиент знал, куда перенаправить?

Я кое-что читал о чтении событий клавиш/щелчков, но все это немного хакерски.

Единственный способ, который я вижу, - это сохранить URL-адрес в коде сервера, но это нужно делать для каждого сеанса браузера отдельно ИЛИ с каким-то окном. история, но как мы должны знать, является ли это новым сеансом или просто обновлением страницы? ?

Мы используем PathLocationStrategy по умолчанию.

У кого-нибудь есть идеи или это просто невозможно?

ОБНОВЛЕНИЕ: Хостинг-модуль My Nancy

public HostingModule()
    {
        Get["/"] = o => Response.AsFile(Path.Combine(Response.RootPath, "index.html"));
        Get["/{ignored*}", ctx => ctx.Request.Headers.Accept.Any(x => x.Item1 == "text/html")] = o =>
            {
                return Response.AsFile(Path.Combine(Response.RootPath, "index.html"));

            };
    }

Таким образом, все запросы с заголовком text/html должны приниматься и возвращать index.html по умолчанию. Это работает.

НО: проблема в том, что все файлы в index.html запрашиваются относительно исходного пути: например.

Первый запрос: "foo.com/order/5" -> ответ index.html -> после этого клиент начинает загружать все скрипты в index.html -> но так как запрос был foo.com/order/5 все скрипты пытался загрузить так: foo.com/order/script1.js вместо foo.com/script1.js

-> Так что я получаю только беспорядок из 404 ошибок, или если я сохраняю свой обработчик StatusCodehandler перенаправления для ошибок 404, он снова и снова перенаправляет клиента на index.html...

Но спасибо за помощь


person Cabe Skuriles    schedule 26.10.2016    source источник
comment
Не перенаправлять на /   -  person Fabio Antunes    schedule 26.10.2016
comment
Это приведет только к ошибке 404, если маршрут не определен явно в Нэнси до загрузки приложения.   -  person Cabe Skuriles    schedule 27.10.2016


Ответы (1)


Итак, вы перенаправляете для отображения index.html, который содержит ваше угловое приложение. Я бы решил это, используя 2 маршрута, индексный маршрут и жадный маршрут, который ищет заголовок accept со значением text/html (который должен быть любым запросом браузера)

Первый маршрут:

Get("/", ...);

Это целевая страница индекса.

Второй маршрут использует жадный маршрут:

https://github.com/NancyFx/Nancy/wiki/Defining-routes#pattern

Get("/{ignored*}", ..., ctx => ctx.Request.Headers.Accept.Any(x => x.Item1 == "text/html"));

Таким образом, любой запрос, который не ищет html, вернет страницу по умолчанию. В то время как что-либо из angular, которое должно принимать application/json, будет отвечать на все остальные запросы.

person Phill    schedule 26.10.2016
comment
Хм... может быть, я не правильно понимаю, но: маршрут Angular - это не order.html, а больше, чем order/5 -> Обычно это обрабатывается внутренним маршрутизатором. Но как только я открываю новую вкладку и ввожу URL-адрес, например: shop.com/order/5 -> сервер получает запрос / потому что угловое приложение (и его маршрутизатор) еще не запущено. -> Таким образом, сервер проверит, является ли это запросом HTML - > НЕТ - > проверьте вызовы API - > НЕТ - > вернет index.html по умолчанию, и клиент запустит угловое приложение. Но запрос исходного заказа/5 пропал... - person Cabe Skuriles; 27.10.2016
comment
У вашего углового приложения есть целевая страница, верно? Вот почему вы перенаправляете на /, то, что я написал, является корневым маршрутом и универсальным маршрутом (если не приложением/json), цель перехвата всего состоит в том, чтобы предотвратить перенаправление на / и просто возврат вашего лендинга по умолчанию страница, которая совпадает с / - person Phill; 27.10.2016
comment
Уловите все, увидит, что запрос для /order/5 не принимает application/json и вернет страницу index.html, которую вы используете для /, затем ваше угловое приложение сработает и запрашивает /order/5 с маршрута, который принимает application/json - person Phill; 27.10.2016
comment
Я надеюсь, что это имеет больше смысла @CabeSkuriles - person Phill; 27.10.2016
comment
Пока согласен, но проблема теперь в том, что файлы скриптов называются реалтивными до последнего маршрута. Я обновил свой вступительный пост выше. - person Cabe Skuriles; 27.10.2016
comment
@CabeSkuriles просто заставьте все сценарии начинаться с корня, добавьте к пути сценария префикс /, поэтому вместо scripts/script1.js вы должны сделать /scripts/script1.js, чтобы убедиться, что путь всегда идет от корня домена. - person Phill; 27.10.2016