React-маршрутизатор с Saga-сервером Перенаправление рендера
Проблема в том, что у меня есть первоначальный запрос на выборку, который получает строку запроса с URL-адреса и делает запрос на получение указанной страницы продукта.
Та же логика и маршрутизация используются на стороне клиента и на стороне сервера.
Запрос API выполняется в redux-saga
, но, если это не удается (нет соответствующего продукта), сайт уже находится на /product
маршрут, и поэтому перенаправление должно произойти.
На стороне клиента это очень просто, так как его можно перенаправить динамически, используя browserHistory
или просто window.location.href
, но на сервере я должен был бы передать res
объект и использование res.redirect
и, возможно, использовать две разные функции перенаправления с этим подходом.
Другое решение состоит в том, чтобы поймать это самым лучшим способом; на экспресс index.js во время ReactDOMServer.renderToString(component)
, а также на конечной точке на стороне клиента при сбое - с другой логикой. Например, представление 404 с экспресс-перенаправлением. Но потому что saga
В любом случае, это не самый верхний элемент иерархии. Чтобы выбросить этот 404 и перехватить его в самом верхнем контексте (на экспресс-сервере), нужно передать его вверх и вверх очень "грязным" способом try/catch.
Любые предложения, как решить это с точки зрения правильности? Я действительно не хочу, чтобы логика маршрутизации удваивалась на экспресс-стороне, поэтому я бы предпочел, чтобы она была хорошо обработана с помощью изоморфного кода.
1 ответ
Вы, вероятно, выставляете свое основное состояние, которое будет передано передним кодом. Любые звонки, которые возвращаются из саг, могут обновить это состояние. Мы используем set404()
а также set301()
действия, когда примитивная сага не возвращает данные, которые мы хотим. Эти действия вызваны, и они устанавливают return404: true
или же return301: true
в основном государственном объекте. Поэтому, прежде чем визуализировать приложение в строку, мы проверяем этот объект. Если какой-либо из них присутствует, мы возвращаем соответствующий ответ от сервера.