如何为React设置一个Node.js Express服务器

694 阅读2分钟

如何为React设置一个Node.js Express服务器

React是一个JavaScript库,用于构建用户界面,并使用可重用的UI组件开发单页应用程序。React用于构建可以与后端服务器通信的前端应用程序。

简介

本指南将开发一个简单的React应用程序,并使用Node.js服务器将其连接到服务器构建。我们将使用create-react-app 命令引导React应用,然后通过设置代理将其连接到Node.js。

前提条件

要跟上这篇文章,具备以下条件将很有帮助。

  • 对[Node.js]、[Express]、[npm]和[React.js]有经验。
  • 安装了[Node.js]。
  • 一个文本编辑器,最好是[VS Code]。
  • 一个网络浏览器,在这种情况下是[谷歌浏览器]。

设置文件夹结构

Folder Structure

第一步是为我们的案例创建一个根文件夹,demoreactapp ,以保存我们的应用程序的所有文件。然后,我们将有client 目录,它将容纳所有React App的文件。

node_modules 文件夹将包含我们的server.js 文件的所有 NPM 包。node_modules 文件夹将在我们安装NPM包时自动生成。

接下来将需要创建一个server.js 文件。该文件将包含一个Express服务器,它将作为我们的后端。package.json 文件是在终端运行npm init -y 命令时自动生成的。

创建React应用程序

从终端,使用cd 命令浏览到根目录,并运行以下命令。

$cd demoreactapp
$npx create-react-app client

上述命令将在根目录下创建一个名称为client 的 React 应用程序。

设置Express服务器

下一步是在文件server.js 中创建一个Express服务器。

从终端浏览到根目录并运行下面提到的命令。

$npm init -y

该命令将自动生成package.json 文件。接下来将需要运行下面的命令来安装Express,它将作为一个依赖关系保存在package.json

$npm install express --save

现在编辑文件server.js ,如下所示。

const express = require('express'); //Line 1
const app = express(); //Line 2
const port = process.env.PORT || 5000; //Line 3

// This displays message that the server running and listening to specified port
app.listen(port, () => console.log(`Listening on port ${port}`)); //Line 6

// create a GET route
app.get('/express_backend', (req, res) => { //Line 9
  res.send({ express: 'YOUR EXPRESS BACKEND IS CONNECTED TO REACT' }); //Line 10
}); //Line 11

第1行和第2行--需要Express并允许我们在我们的server.js 文件中使用它。

第3行 - 它将设置Express服务器的运行端口。

第6行 - 将在控制台显示一条信息,表明服务器正在按预期工作。

第9至11行 - 它将设置一个GET route ,稍后我们将从我们的客户端React App中获取。

设置代理

在这一步,当我们运行create-react-app 命令时,Webpack开发服务器被自动生成了。我们的react App正在前端的Webpack开发服务器上运行。

我们可以将客户端的API请求代理到服务器端的API上。服务器端的API(Express服务器)将在5000端口运行。

Webpack开发服务器(WDS)是一个帮助开发者对Web应用的前端进行修改的工具,并将其渲染到浏览器上,而不需要刷新浏览器。

与其他做同样工作的工具相比,它的独特之处在于捆绑内容不以文件的形式写入磁盘,而是存储在内存中。当人们试图对代码和样式进行调试时,这一优势是至关重要的。

首先,设置代理浏览客户目录并定位其package.json 文件。在它上面添加下面这行。

"proxy":"http://localhost:5000"

修改后的package.json 文件将如下图所示。

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.10",
    "@testing-library/react": "^11.2.6",
    "@testing-library/user-event": "^12.8.3",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-scripts": "4.0.3",
    "web-vitals": "^1.1.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:5000"
}

修改后的package.json 文件将让webpack代理API请求到运行在5000端口的Express后端服务器。

从React调用Express后端服务器

首先是浏览到client/src ,并编辑文件App.js ,使其显示如下。

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
state = {
    data: null
  };

  componentDidMount() {
    this.callBackendAPI()
      .then(res => this.setState({ data: res.express }))
      .catch(err => console.log(err));
  }
    // fetching the GET route from the Express server which matches the GET route from server.js
  callBackendAPI = async () => {
    const response = await fetch('/express_backend');
    const body = await response.json();

    if (response.status !== 200) {
      throw Error(body.message) 
    }
    return body;
  };

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <p className="App-intro">{this.state.data}</p>
      </div>
    );
  }
}

export default App;

componentDidMount() 里面,函数callBackendAPI() 被调用。这个函数将获取之前在Express服务器中创建的路由,然后set{data: null} ,以获取请求-响应。

在render函数内部包含this.state.data 的那一行,它将新的数据渲染到DOM

运行应用程序

我们导航到根目录demoreactapp ,并运行下面的命令。

$cd demoreactapp
$node server.js

运行完文件server.js ,接下来我们将进入我们的浏览器,"http://localhost:5000/express_backend",下面的信息将被显示。

Get Route success

以上显示了我们的Express服务器正在按预期工作,我们创建的GET route ,并且可以从客户端获取路由。

另外,注意URL路径与我们在server.js 文件中设置的GET route 的路径相同。

接下来,在终端中浏览到client 目录,并运行以下命令。

$cd client
$npm start

上面的命令将运行React Dev服务器,它运行在3000端口,并自动在Web浏览器中打开。

将会显示下面的屏幕,上面有一条信息。

React app running

server.js 最后,我们将从GET route 中获取的数据渲染到我们的前端React App,如上图所示。

如果Express服务器断开了连接,React服务器将继续运行。然而,与后台的连接将丢失,并且不会显示任何东西。

结论

Express后台可以做很多事情,比如调用数据库,但在本指南中,我们集中讨论了如何从客户端的React App快速连接到后台的Express服务器。