2015-12-28 13 views
6

Przygotowuję prostą aplikację z zabawkami do nauki React/Hapi i wszystko działa dobrze dopóki nie spróbuję i nie ustawię routing na serwerze. Serwer działa bezbłędnie i renderuje "/" poprawnie w świecie hello.Reaguj na błędy renderowania serwerów ruterowych: Ostrzeżenie: Nie powiodło się propType: Wymagana propyczna historia `nie została określona w` RoutingContext`

Jednak po przejściu do "/ testu" pojawiają się następujące błędy.

Warning: Failed propType: Required prop `history` was not specified in `RoutingContext`. 
Warning: Failed propType: Required prop `location` was not specified in `RoutingContext`. 
Warning: Failed propType: Required prop `routes` was not specified in `RoutingContext`. 
Warning: Failed propType: Required prop `params` was not specified in `RoutingContext`. 
Warning: Failed propType: Required prop `components` was not specified in `RoutingContext`. 

Gdzie się tu mylę?

Server.js

'use strict'; 

const Hapi = require('hapi'); 
const Path = require('path'); 

const server = new Hapi.Server(); 
server.connection({ port: 3000}); 

//React Junk 
import React from 'react'; 
import {createStore} from 'redux'; 
import {Provider} from 'react-redux'; 
import { renderToString } from 'react-dom/server'; 
import reducer from './../common/Reducers/index.js'; 
import { match, RoutingContext } from 'react-router'; 
import Routes from './../common/routes/Routes.js'; 

const handleRender = function(req, res) { 
    const store = createStore(reducer); 
    match({Routes, location: req.url}, (error, redirectLocation, renderProps) => { 
     //res(req.url); 
     if(error) { 
      res(error.message); 
     } 
     else { 
      const html = renderToString(
      <Provider store={store}> 
       <RoutingContext {...renderProps} /> 
      </Provider> 
      ); 

      const initialState = store.getState(); 

      res(renderFullPage(html, initialState)); 
     } 

    }); 
    // const html = renderToString(
    // <Provider store={store}> 
    //  <App /> 
    // </Provider> 
    //); 

    // const initialState = store.getState(); 

    // res(renderFullPage(html, initialState)); 
} 

const renderFullPage = function(html, initialState) { 
    return ` 
     <!doctype html> 
     <html> 
      <head> 
       <title>Please Work</title> 
      </head> 
      <body> 
       <div id="app-mount">${html}</div> 
       <script> 
        window.__INITIAL_STATE__ = ${JSON.stringify(initialState)} 
       </script> 
       <script src="/static/bundle.js"></script> 
      </body> 
     </html> 
    `; 
} 

server.register(require('inert'), (err) => { 
    server.route({ 
     method: 'GET', 
     path: '/static/{filename}', 
     handler: function (req, reply) { 
      reply.file('static/' + req.params.filename); 
     } 
    }) 
    server.route({ 
     method: 'GET', 
     path: '/', 
     handler: function(req, res) { 
      res('hello world'); 
     } 
    }); 
    server.route({ 
     method: 'GET', 
     path: '/{path*}', 
     handler: function(req, res) { 
      handleRender(req, res); 
     } 
    }) 

    server.start(() => { 
     console.log('Server running at:', server.info.uri); 
    }) 
}) 

Routes.js

import { Route } from 'react-router'; 

//Components 
import App from './../components/App.jsx'; 
import Name from './../components/Name.jsx'; 

export default (
    <Route path="/" component={App}> 
     <Route path="test" component={Name} /> 
    </Route> 
); 

Ponieważ poproszono ich o

Client entry.jsx

import React from 'react'; 
import ReactDOM from 'react-dom'; 

import {createStore} from 'redux'; 
import {Provider} from 'react-redux'; 
import App from './../common/components/App.jsx'; 
import Router from './../common/routes/Router.jsx'; 
import reducers from './../common/Reducers'; 

const initialState = window.__INITIAL_STATE__; 
const store = createStore(reducers(initialState)); 

ReactDOM.render(
    <Provider store={store}> 
     <Router /> 
    </Provider> 
, document.getElementById('app-mount')); 

Router Client

import React, {Component} from 'react'; 
import ReactDOM from 'react-dom'; 
import { Router, Route } from 'react-router'; 
import createHashHistory from 'history/lib/createHashHistory'; 

const history = createHashHistory(); 

import Routes from './Routes.js'; 

export default (
    <Router history={history}> 
     <Routes /> 
    </Router> 
); 
+0

Co twoja stronie klienta renderowania kodu wyglądać? Czy są to błędy po stronie klienta? Lub błędy po stronie serwera? – Brandon

+0

Dodałem wpis klienta i router klienta do wpisu. Uważam, że są po stronie serwera? Chociaż mam ten błąd w moim konsoli Warning: React.createElement: typ nie powinno być puste, niezdefiniowane, wartość logiczna lub numer. Powinien to być ciąg (dla elementów DOM) lub ReactClass (dla komponentów kompozytowych). – trattles

Odpowiedz

3

Trzeba zdać history jako rekwizyt do Router na kliencie:

export default (
    <Router history={history}> 
     <Routes /> 
    </Router> 
); 

Prawdopodobny problem z serwera kodu jest to, że nie przechodzą szlaki do match poprawnie. Oczekuje właściwości o nazwie routes, a nie Routes. Spróbuj tego:

match({routes: Routes, location: req.url}, (error, redirectLocation, renderProps) => { 

Szczególnie zwrócić uwagę to oświadczenie z documentation:

If all three parameters are undefined, this means that there was no route found matching the given location. 
+0

Po wykonaniu tych czynności nadal otrzymuję te same błędy: Ostrzeżenie: Nie powiodło się propType: Wymagana propyczna historia 'nie została określona w' RoutingContext'. Ostrzeżenie: Failed propType: Wymagana prop 'location' nie została określona w' RoutingContext'. Ostrzeżenie: Nie powiodło się propType: Wymagane podpowiedzenie 'routes' nie zostało określone w' RoutingContext'. Ostrzeżenie: Nie powiodło się propType: Wymagane parametry 'prop' nie zostały określone w 'RoutingContext'. Ostrzeżenie: Failed propType: Required "components" nie został określony w 'RoutingContext'. – trattles

+0

w konsoli przeglądarki lub na serwerze? – Brandon

+0

To są błędy po stronie serwera. Wygląda na to, że routing na serwerze nie przekazuje niczego w renderpropach? – trattles

Powiązane problemy