Wir erstellen zum ersten Mal ein Projekt mit dem MERN-Stack. Es ist eine Stand-ups und Retros App. Das Problem ist, dass unsere Reaktionskomponentenereignisse nicht auf der Serverseite funktionieren, aber perfekt auf der Clientseite funktionieren. Grundsätzlich können wir eine statische Seite mit React bedienen, aber keine dynamische Seite, die den Status aktualisiert und speichert, wenn der Knoten & Express als unser Server verwendet wird. Jede Hilfe, um diesen Block zu reparieren, wird sehr geschätzt.Reaktionskomponentenereignisse funktionieren nicht auf NodeJs + Express-Server
Wir haben unser Projekt mit react-app initialisiert. Unsere package.json wie folgt aussieht: { "name": "standup", "version": "0.1.0", "private": true, "devDependencies": { "babel-cli": "^6.22.2", "babel-core": "^6.22.1", "ejs": "^2.5.5", "express-react-engine": "^0.6.0", "express-react-views": "^0.10.2", "http-server": "^0.9.0", "mocha": "^3.2.0", "react-router": "^3.0.2", "react-scripts": "0.8.5", "should": "^11.2.0", "supertest": "^3.0.0" }, "dependencies": { "body-parser": "^1.16.0", "express": "^4.14.1", "react": "^15.4.2", "react-addons-test-utils": "^15.4.2", "react-dom": "^15.4.2" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } }
Wenn wir npm start
laufen und besuchen localhost: 3000 wir diese Ansicht erhalten, die dynamisch aktualisiert wird: client side rendering screenshot
Wenn wir den Knoten Server mit nodemon --exec babel-node --presets 'react,es2015' src/server.js
keine der Tasten öffnen arbeiten.
Der einzige erkennbare Unterschied in der Registerkarte Netzwerk ist Bundle.js. Welches ist nicht auf der Serverseite geladen.
This is our Express server:
import path from 'path';
import {Server} from 'http';
import Express from 'express'
import React from 'react';
import { renderToString } from 'react-dom/server';
import HomePage from './components/HomePage'
import RetroPage from './components/RetroPage'
import StandupPage from './components/StandupPage'
const app = new Express();
const server = new Server(app);
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
console.log(path)
app.use(Express.static(path.join(__dirname, 'public')));
app.get('/', (req, res) => {
let markup = renderToString(<HomePage />)
res.render('index', {markup});
});
app.get('/standup', (req, res) => {
let markup = renderToString(<StandupPage/>)
res.render('index', {markup})
})
app.get('/retro', (req, res) => {
let markup = renderToString(<RetroPage/>)
res.send(markup);
})
const port = process.env.PORT || 3000;
const env = process.env.NODE_ENV || 'production';
server.listen(port, err => {
if (err) {
return console.error(err);
}
console.info(`Server running on http://localhost:${port} [${env}]`);
})
Ich zeige die React-Komponenten hier nicht, weil wir wissen, dass sie für die Clientseite gut funktionieren.
Wir glauben, dass wir etwas im Express-Routing vermissen, wenn wir die Anfragen senden, aber nicht den Finger darauf legen können.
Vielen Dank!
Ich bin mir nicht sicher, ob ich dem, was du versuchst, folge. Versuchen Sie serverseitig zu rendern? Sind Sie sicher, von Seite zu Seite über react-router zu gehen ... Ich habe nur React-Projekte wie folgt gesehen: Reagieren für das Frontend und eine Node/Express-REST-API, die vom React-Projekt aufgerufen wird . – Turtle