Ez egy nagyon gyakori kérdés az újabb React fejlesztők körében, és egy kérdésem volt, amikor a React és a Node.js programmal kezdtem. Ebben a rövid példában megmutatom, hogyan lehet create-react-app
működni a Node.js és az Express Back-end programmal.
create-reagál-app
Hozzon létre egy projektet a create-react-app
.
npx create-react-app example-create-react-app-express
Hozzon létre egy /client
könyvtárat a könyvtár alatt, example-create-react-app-express
és helyezze át az összes által létrehozott React kazánlapkódot create-react-app
az új ügyfélkönyvtárba.
cd example-create-react-app-expressmkdir client
A Node Express kiszolgáló
Hozzon létre egy package.json
fájlt a gyökérkönyvtárban ( example-create-react-app-express
), és másolja a következő tartalmat:
{ "name": "example-create-react-app-express", "version": "1.0.0", "scripts": { "client": "cd client && yarn start", "server": "nodemon server.js", "dev": "concurrently --kill-others-on-fail \"yarn server\" \"yarn client\"" }, "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.4" }, "devDependencies": { "concurrently": "^4.0.1" } }
Megjegyzés: concurrently
A React alkalmazást és a Szervert egyszerre futtatom. A –kill-others-on-fail
zászló megöl más folyamatokat, ha az egyik nem nulla állapotkóddal lép ki.
Telepítés nodemon
globálisan és a kiszolgáló függőségei:
npm i nodemon -g yarn
Hozzon létre egy server.js
fájlt, és másolja a következő tartalmat:
const express = require('express'); const bodyParser = require('body-parser'); const app = express(); const port = process.env.PORT || 5000; app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.get('/api/hello', (req, res) => { res.send({ express: 'Hello From Express' }); }); app.post('/api/world', (req, res) => { console.log(req.body); res.send( `I received your POST request. This is what you sent me: ${req.body.post}`, ); }); app.listen(port, () => console.log(`Listening on port ${port}`));
Ez egy egyszerű Express kiszolgáló, amely az 5000-es porton fog futni, és két API-útvonallal rendelkezik: GET
- /api/hello
, és POST
- /api/world
.
Ezen a ponton futtathatja az Express kiszolgálót a következő paranccsal (még mindig a gyökérkönyvtárban):
node server.js
Most navigáljon ide //localhost:5000/api/hello
, és a következőket fogja kapni:

POST
Miután elkészítjük a React alkalmazást, tesztelni fogjuk az útvonalat.
A React App
Most váltson át arra a client
könyvtárra, ahol a React alkalmazásunk él.
Adja hozzá a következő sort az package.json
által létrehozott fájlhoz create-react-app
.
"proxy": "//localhost:5000/"
Az Express háttér-kiszolgáló és a létrehozott projekt használatának kulcsa create-react-app
a proxy használata. Ez arra utasítja a Web-pack fejlesztő kiszolgálót, hogy proxyolja meg API-kéréseinket az API-kiszolgálónkhoz, tekintettel arra, hogy az Express-kiszolgálónk fut localhost:5000
.
Most módosítsa úgy, ./client/src/App.js
hogy hívja az Express API Back-endünket, a változtatások félkövéren vannak feltüntetve.
import React, { Component } from 'react'; import logo from './logo.svg'; import './App.css'; class App extends Component { state = { response: '', post: '', responseToPost: '', }; componentDidMount() { this.callApi() .then(res => this.setState({ response: res.express })) .catch(err => console.log(err)); } callApi = async () => { const response = await fetch('/api/hello'); const body = await response.json(); if (response.status !== 200) throw Error(body.message); return body; }; handleSubmit = async e => { e.preventDefault(); const response = await fetch('/api/world', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ post: this.state.post }), }); const body = await response.text(); this.setState({ responseToPost: body }); }; render() { return ( Edit src/App.js
and save to reload.
Learn React {this.state.response}
Post to Server:
this.setState({ post: e.target.value })} /> Submit {this.state.responseToPost}
); } } export default App;
Létrehozunk egy callApi
módszert, amellyel interakcióba léphetünk az GET
Express API útvonalunkkal, majd meghívjuk ezt a módszert, componentDidMount
és végül beállítjuk az állapotot az API válaszra, amely a Hello From Express lesz .
Vegye figyelembe, hogy nem használtunk teljesen minősített URL- //localhost:5000/api/hello
t az API meghívásához, annak ellenére, hogy a React alkalmazásunk egy másik porton fut (3000). Ennek oka azproxy
sor, amelyet package.json
korábban hozzáadtunk a fájlhoz.
Van egy űrlapunk egyetlen bemenettel. Amikor elküldi a hívásokat handleSubmit
, amelyek viszont az POST
Express API útvonalunkat hívják meg, akkor az állapot válaszát elmenti, és üzenetet jelenít meg a felhasználónak: Megkaptam a POST kérését. Ezt küldte nekem: [üzenet a bemenetről] .
Most nyissa meg ./client/src/App.css
és módosítsa az .App-header
osztályt az alábbiak szerint (félkövér betűkkel)
.App-header { ... min-height: 50%; ... padding-bottom: 10px; }
Az alkalmazás futtatása
Ha még mindig fut a szerver, menjen előre, és állítsa le a Ctrl + C megnyomásával a terminálon.
A projekt gyökérkönyvtárából futtassa a következőket:
yarn dev
Ez egyúttal elindítja a React alkalmazást és futtatja a szervert.
Most keresse meg a gombot, //localhost:3000
és megnyomja a React alkalmazást, megjelenítve az GET
Express útvonalunkról érkező üzenetet . Szép ?!

Írjon be valamit a beviteli mezőbe, és küldje el az űrlapot, és az POST
Express útvonal válasza megjelenik közvetlenül a beviteli mező alatt.

Végül vessen egy pillantást a termináljára, és látni fogja az üzenetet, amelyet az ügyféltől küldtünk, mert console.log
az POST
Express útvonalon a kérelem szervet hívjuk meg .

Gyártási telepítés Herokuba
Nyissa meg server.js
és cserélje le a következő tartalommal:
const express = require('express'); const bodyParser = require('body-parser'); const path = require('path'); const app = express(); const port = process.env.PORT || 5000; app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); // API calls app.get('/api/hello', (req, res) => { res.send({ express: 'Hello From Express' }); }); app.post('/api/world', (req, res) => { console.log(req.body); res.send( `I received your POST request. This is what you sent me: ${req.body.post}`, ); }); if (process.env.NODE_ENV === 'production') { // Serve any static files app.use(express.static(path.join(__dirname, 'client/build'))); // Handle React routing, return all requests to React app app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'client/build', 'index.html')); }); } app.listen(port, () => console.log(`Listening on port ${port}`));
Nyissa meg, ./package.json
és adja hozzá a következőket a scripts
bejegyzéshez
"start": "node server.js", "heroku-postbuild": "cd client && npm install && npm install --only=dev --no-shrinkwrap && npm run build"
Heroku start
alapértelmezés szerint futtatja a szkriptet, és ez szolgálja az alkalmazásunkat. Ezután meg akarjuk utasítani Herokut, hogy készítse el kliens alkalmazásunkat, ezt heroku-postbuild
szkript segítségével tesszük .
Most menjen át Heroku-hoz, és jelentkezzen be (vagy nyisson meg egy fiókot, ha még nincs ilyen).
Hozzon létre egy új alkalmazást, és adjon neki egy nevet

Kattintson a Telepítés fülre, és kövesse a telepítési utasításokat (ami szerintem eléggé magától értetődő, nincs értelme itt lemásolni őket?)

Ez az, megnyithatja az alkalmazást az alkalmazás megnyitásához kattintson a jobb felső sarokban található Alkalmazás megnyitása gombra az alkalmazás Heroku műszerfalán belül.
Látogassa meg az oktatóanyag telepített alkalmazását: //cra-express.herokuapp.com/
Egyéb telepítési lehetőségek
Itt írok más telepítési lehetőségekről:
- Netlify
- Most
- Heoku (részletesebb magyarázat)
Projekt felépítése
Ez lesz a végleges projektszerkezet.

Szerezd meg a teljes kódot a GitHub tárházban.
Köszönöm, hogy elolvastad, és remélem, hogy élvezted. Ha bármilyen kérdése, javaslata van, tudassa velem az alábbi megjegyzéseket!
Kövess engem a Twitteren, a GitHubon, a Mediumon, a LinkedIn-en vagy mindegyiken.
This post was originally posted on my personal blog website.
Update 8/25/19: I have been building a prayer web app called "My Quiet Time - A Prayer Journal". If you would like to stay in the loop please sign up through the following link: //b.link/mqt
The app will be released before the end of the year, I have big plans for this app. To see some mockup screenshots follow the following link: //pc.cd/Lpy7
My DMs on Twitter are open if you have any questions regarding the app ?