2015-12-28 4 views
6

Ich richte eine einfache Spielzeug App ein, um React/Hapi zu lernen und alles funktioniert gut, bis ich versuche und setze Server-Routing. Der Server läuft ohne Fehler und rendert "/" richtig mit Hallo Welt.Reagieren Router serverseitige Renderfehler: Warnung: fehlgeschlagen propType: Erforderliche Requisite `history` wurde nicht in` RoutingContext` festgelegt

Wenn ich jedoch zu "/ test" navigiere, erhalte ich die folgenden Fehler.

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`. 

Wohin gehe ich hier falsch?

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> 
); 

Weil sie für

Kunde entry.jsx

wurden gebeten,
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')); 

Client Router

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

Was macht Ihr clientseitige Render-Code aussehen? Sind diese Fehler clientseitige Fehler? Oder serverseitige Fehler? – Brandon

+0

Ich habe Client Entry und Client Router zum Beitrag hinzugefügt. Ich glaube, sie sind Serverseite? Obwohl ich diesen Fehler in meiner Konsole haben Warnung: React.createElement: Typ nicht null, nicht definiert, boolean oder Zahl sein sollte. Es sollte eine Zeichenfolge (für DOM-Elemente) oder eine ReactClass (für zusammengesetzte Komponenten) sein. – trattles

Antwort

3

Sie benötigen history als Stütze zu Router auf dem Client weitergeben müssen:

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

Das wahrscheinliche Problem mit Ihrem Server-Code ist, dass Sie nicht die Routen zu match korrekt sind vorbei. Es erwartet eine Eigenschaft namens routes, nicht Routes. Versuchen Sie folgendes:

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

Gerade diese Aussage Vermerk des documentation:

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

Wenn ich das tue, bekomme ich immer noch die gleichen Fehler: Warnung: fehlgeschlagen propType: Required prop 'Geschichte' wurde nicht in' RoutingContext' angegeben. Warnung: Fehlgeschlagene propType: Erforderliche prop 'location' wurde nicht in' RoutingContext' angegeben. Warnung: fehlgeschlagen propType: Erforderliche Prop-'routes' wurde in' RoutingContext' nicht angegeben. Warnung: fehlgeschlagen propType: Erforderliche Prop-'params' wurde nicht in' RoutingContext' angegeben. Warnung: Fehlgeschlagene propType: Erforderliche prop 'Komponenten' wurde nicht in' RoutingContext' angegeben. – trattles

+0

in der Browser-Konsole oder auf Ihrem Server? – Brandon

+0

Sie sind serverseitige Fehler. Es sieht so aus, als ob das Routing auf dem Server nichts für renderprops übergibt. – trattles

Verwandte Themen