2016-05-18 3 views
1

Wenn ich zuerst den Server mit node app.js läuft alles in Ordnung ist, bekomme ich listening on 5050. Dann gehe ich zu localhost: 5050/und ich bekomme diese Warnungen in der Konsole wo der Server läuft.TypeError: _this.store.getState ist keine Funktion bei der Verbindung von Redux

Warning: Failed propType: Required prop `store.subscribe` was not specified in `Provider`. 
Warning: Failed Context Types: Required child context `store.subscribe` was not specified in `Provider`. 

Die Komponente macht es in Ordnung, aber wenn ich auf localhost gehen: 5050/ballerviews ich diese bekommen auf dem Server

TypeError: _this.store.getState is not a function 
    at new Connect (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react-redux/lib/components/connect.js:133:38) 
    at [object Object].ReactCompositeComponentMixin.mountComponent (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactCompositeComponent.js:148:18) 
    at [object Object].wrapper [as mountComponent] (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactPerf.js:66:21) 
    at Object.ReactReconciler.mountComponent (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactReconciler.js:37:35) 
    at ReactDOMComponent.ReactMultiChild.Mixin.mountChildren (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactMultiChild.js:241:44) 
    at ReactDOMComponent.Mixin._createContentMarkup (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactDOMComponent.js:591:32) 
    at ReactDOMComponent.Mixin.mountComponent (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactDOMComponent.js:479:29) 
    at Object.ReactReconciler.mountComponent (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactReconciler.js:37:35) 
    at [object Object].ReactCompositeComponentMixin.mountComponent (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactCompositeComponent.js:225:34) 
    at [object Object].wrapper [as mountComponent] (/Users/freddiecabrera/Desktop/ullibol-client/node_modules/react/lib/ReactPerf.js:66:21) 

Sie die vollständige Projekt auf meinem Github sehen kann, da ich durch Betrachten sie es fühlen Sie können das beste Verständnis bekommen.

Ich habe versucht, dies den ganzen Tag heute herauszufinden, und ich konnte nicht. Es funktionierte gut, bevor ich versuchte, auf dem Server zu rendern. Ich schätze die Hilfe und wenn Sie weitere Informationen benötigen, um die Frage zu beantworten, lassen Sie es mich wissen.

Antwort

5

Es gibt nur zwei kleine Probleme:

1. ES2015-Modul -> Commonjs

Sie sind ein ES2015 export default in src/store.js verwenden, aber Sie dann benötigen sie über Commonjs in app.js auf line #11.

Das ist natürlich in Ordnung, aber Sie sollten auf die Standardeigenschaft zugreifen, wenn Sie sie benötigen. Aktualisieren Sie die Zeile wie folgt:

// Old 
const store = require('./src/store.js') 

// New 
const store = require('./src/store.js').default 

2. Aufruf document auf dem Server

Auf line #41 von src/components/BallerViews.jsx Sie das Dokument zugreifen, die nicht auf dem Server vorhanden. Eine schnelle Lösung wäre, diese Zeile in eine Bedingung zu schreiben:

// Old 
document.body.style.backgroundColor = '#0e0e13' 

// New 
if (typeof document !== 'undefined') { 
    document.body.style.backgroundColor = '#0e0e13' 
} 
+0

Damn! Vielen Dank, du hast mich gerettet. Ich schätze deine Hilfe sehr. Also grundsätzlich jedes Mal, wenn ich auf das Dokument oder das Fenster zugreifen möchte, muss ich es in einen bedingten umbrechen? –

+0

@FreddieCabrera Ja, aber nur beim Server-Rendering. Der Knoten hat kein Wissen über das DOM. Eine beliebte Praxis ist es, Globals wie '__CLIENT__' und' _SERVER__' zu verwenden, damit Sie jedes Ziel leicht erreichen können. Sie können dies in Ihrem Server-Einstiegspunkt (app.js) und in Ihrer Webpack-Konfiguration tun. Ich habe ein Gist erstellt, um Ihnen zu zeigen, wie man es einrichtet: https://gist.github.com/iamlacroix/38fb4ce4670313bae2a913bbc54b2ae3 –

+0

@MichaelLaCroix .default reparierte dieses für mich auch. Es ist ziemlich schwierig, den Best Practices zu folgen, da so viele Beispiele ES2015 gegen Legacy mischen. – jjr2527