2015-09-16 3 views
1

У меня довольно простая установка входа (код ниже) с несколькими компонентами, требующими аутентификации. Когда я перехожу на http://localhost:8000/, он перенаправляется на http://localhost:8000/login, и все в порядке. Если я вхожу в систему, он возвращается к http://localhost:8000/ и отображает мой основной компонент.Странная проблема навигации с реактивным маршрутизатором

Однако, когда я перехожу непосредственно к http://localhost:8000/login, он говорит: «Не могу GET/login». То же самое с моим компонентом «about». Он работает, когда я добавляю символ фунта: http://localhost:8000/#/login. Может ли кто-нибудь объяснить, что происходит?

var React = require('react'); 
var Main = require('./components/main'); 
var Login = require('./components/login'); 
var About = require('./components/about'); 
var SessionStore = require('./stores/session-store') 
import createBrowserHistory from 'history/lib/createBrowserHistory'; 

import { Router, Route, Link, History, IndexRoute } from 'react-router'; 

var App = React.createClass({ 

    render: function() { 
     return <div> 
      {this.props.children} 
     </div> 
     } 
}); 

function requireAuth(nextState, replaceState) { 
    if(!SessionStore.isLoggedIn()){ 
    replaceState({ nextPathname: nextState.location.pathname }, '/login'); 
    } 
} 

function redirectIfLoggedIn(nextState, replaceState){ 
    if(SessionStore.isLoggedIn()){ 
    replaceState({ nextPathname: nextState.location.pathname }, '/'); 
    } 
} 

var routes = (
    <Router history={createBrowserHistory()}> 
    <Route path="/" component={App}> 
     <IndexRoute component={Main} onEnter={requireAuth}/> 
     <Route path="login" component={Login} onEnter={redirectIfLoggedIn} /> 
     <Route path="about" component={About} onEnter={requireAuth} /> 
    </Route> 
    </Router> 
) 

React.render(routes, document.querySelector('.container')); 

ответ

1

Быстрый ответ, то http://localhost:8000/#/login работает в яваскрипта приложение в вашем браузере, так что приложение это время подается с / курьерской веб-сервер, и поэтому / (приложение) #/login и /#/about ничего не просит с сервера, но являются маршрутами в приложении JS (react-routes) для визуализации различных компонентов. когда вы вводите /login непосредственно, он должен запрашивать экспресс-сервер, но у вас нет каких-либо экспресс-маршрутов сервера, кроме одного, чтобы обслуживать приложение у корня /.

Так что вплоть до react-routes, а связанные с ними вопросы, спрашивает, как удалить его, но, пожалуйста, быть в курсе, как в октябре '15 react-router изменилось с версии 0.13 до 1.0, который изменил АНИ совсем немного, так что будьте осторожны при чтении примеров, знать версию How to stop /#/ in browser with react-router?