2016-02-08 2 views
7

Я новичок в реактиве и надеюсь, что кто-то может пролить свет на то, почему это происходит и как его отлаживать.React Router не может получить/зависит от функции onEnter

Я следующие маршруты определены:

export default (withHistory, onUpdate) => { 
    const history = withHistory? 
       (Modernizr.history ? 
       new BrowserHistory 
       : new HashHistory) 
      : null; 
    return (
    <Router history={history}> 
     <Route path='/login' component={Login} /> 
     <Route path='/' component={Home} onEnter={requireAuth} /> 
    </Router> 
); 
}; 

requireAuth должен проверить, если пользователь вошел в систему и перенаправить их на страницу входа в систему, если нет:

function requireAuth(nextState, transition) { 
    transition.to("/login"); 
} 

Если я оставить transtion.to Войдите в систему и перейдите к корневому URL-адресу. Я просто вижу сообщение, в котором говорится: «Can not Get /» без сообщений об ошибках в отладчике. Помещение точки останова на этой линии, похоже, ничего не делает.

Что особенно странно в том, что если я заменил transition.to(...) на инструкцию debugger;, тогда метод вызывается и маршрутизация работает отлично.

Должно быть, у меня есть недоразумение, какие-то идеи о том, что это такое?

Редактировать: Я должен добавить, что переход на host:port/login отлично работает, поэтому я знаю, что работает маршрут login.

+1

Какая версия реактивного маршрутизатора? 1.x? – walkerrandophsmith

+0

Я использую версию 1.0.0-бета3 реактивного маршрутизатора. Я попытался обновить версию, которую я использовал, но в итоге я решил ее проще. – shieldstroy

ответ

2

Исходя из углового фона, я неправильно предположил, что маршрутизация происходит исключительно на стороне клиента. Возможно использовать «реактивный маршрутизатор» для клиентской стороны на стороне сервера и.

Звонок transition.to работал на стороне клиента, но выбрасывал исключение, когда на серверной стороне маршрутизировалась и возвращалась страница Cannot GET /. Исключение составлялось, но ничего не регистрировалось.

Я добавил, если заявление, чтобы увидеть, если бы мы были запущены на клиенте:

if(window.location) { 
    if(!loggedIn) { 
     transition.to("/login"); 
    } 
} 

Существует, вероятно, лучший способ справиться с этим, и если я полагаю, что из в конце концов я буду обновлять мой ответ.

0

В соответствии с действующими документами крюк onEnter принимает в качестве второго параметра функцию replace. то есть

type EnterHook = (nextState: RouterState, replace: RedirectFunction, callback?: Function) => any; 

Вы используете другую версию реактивного маршрутизатора? Я пробовал просматривать альтернативные версии docs для крюка onEnter, который принимает объект transition в качестве второго параметра, но мне не удавалось найти что-либо.

+0

Я использую версию 1.0.0-beta3 реактивного маршрутизатора, который передает объект Transition, а не функцию replace. Я попытался обновить версию, которую я использовал, но в итоге я решил ее проще. – shieldstroy

Смежные вопросы