【问题标题】:How to use the same port for React Js and Node Js?如何为 React Js 和 Node Js 使用相同的端口?
【发布时间】:2018-10-31 12:49:32
【问题描述】:

实际上,我希望使用 reactjs 和 nodejs 在网站中创建联系表单。我已经使用 React 创建了表单,对于后端,我必须连接节点 js 以便我可以接收电子邮件。但它没有发生 React 和 Node 都应该在同一个端口上运行。我在 package.json 中提供了一个代理为“http://localhost:3000”,但它仍然无法正常工作。

我已经给出了 react js 和 node js 代码。请帮我解决这个错误。

反应 JS 代码

import React, { Component } from "react";
import axios from "axios";

export default class formSection extends Component {
  state = {
    name: "",
    email: "",
    subject: "",
    comment: ""
  };

  handleChange = e => {
    this.setState({
      [e.target.name]: e.target.value
    });
  };

 async handleSubmit(e) {
    e.preventDefault()
    const {name, email, subject, comment} = this.state

    const contact = await axios.post('/api/contact', {

        name,
        email,
        subject,
        comment

    })

  };

  render() {
    return (
      <section
        className="wow fadeIn big-section"
        id="section-down"
        style={{ visibility: true }}
      >
        <div className="container">
          <div className="row equalize sm-equalize-auto">
            <div
              className="col-md-6 col-sm-12 col-xs-12 sm-margin-30px-bottom wow fadeInLeft"
              style={{ visibility: true, height: 597 }}
            >
              <div className="padding-fifteen-all bg-light-gray border-radius-6 md-padding-seven-all xs-padding-30px-all height-100">
                <span className="text-extra-dark-gray alt-font text-large font-weight-600 margin-25px-bottom display-block">
                  Ready to get started?
                </span>
                <form id="contact-form" onSubmit={e=>this.handleSubmit(e)} method="POST">
                  <div>
                    <div
                      id="success-contact-form"
                      className="no-margin-lr"
                      style={{ display: true }}
                    />
                    <input
                      type="text"
                      name="name"
                      id="name"
                      value={this.state.name}
                      placeholder="Name*"
                      className="border-radius-4  medium-input"
                      onChange={this.handleChange}
                    />
                    <input
                      type="text"
                      name="email"
                      value={this.state.email}
                      id="email"
                      placeholder="E-mail*"
                      className="border-radius-4  medium-input"
                      onChange={this.handleChange}
                    />
                    <input
                      type="text"
                      name="subject"
                      id="subject"
                      value={this.state.subject}
                      placeholder="Subject"
                      className="border-radius-4  medium-input"
                      onChange={this.handleChange}
                    />
                    <textarea
                      name="comment"
                      id="comment"
                      value={this.state.comment}
                      placeholder="Your Message"
                      rows="5"
                      className="border-radius-4  medium-textarea"
                      onChange={this.handleChange}
                    />
                    <button
                      id="contact-us-button"
                      type="submit"
                      className="btn btn-small border-radius-4 btn-dark-gray"

                    >
                      send message
                    </button>
                  </div>
                </form>
              </div>
            </div>
            <div
              className="col-md-6 col-sm-12 col-xs-12 last-paragraph-no-margin wow fadeInRight"
              style={{ visibility: true, height: 597 }}
            >
              <div className="padding-ten-all bg-light-gray border-radius-6 md-padding-seven-all xs-padding-30px-all height-100 sm-text-center">
                <img
                  src="images/about-img1.jpg"
                  alt=""
                  className="border-radius-6 margin-35px-bottom xs-margin-30px-bottom"
                  data-no-retina=""
                />
                <span className="text-large font-weight-600 alt-font text-extra-dark-gray margin-5px-bottom display-block">
                  Let's plan for a new project?
                </span>
                <p>
                  Lorem Ipsum is simply dummy text of the printing and
                  typesetting industry, Lorem Ipsum has been the standard dummy
                  text.
                </p>
                <a
                  href="about-us-modern.html"
                  className="btn btn-dark-gray btn-small text-extra-small border-radius-4 margin-25px-top"
                >
                  About Company
                </a>
              </div>
            </div>
          </div>
        </div>
      </section>
    );
  }
}

节点 JS 代码

const express = require('express');
const bodyParser = require('body-parser');
const nodemailer = require('nodemailer');
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));

app.post('/api/contact', (req, res) => {

console.log(req.body);

});




const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {

    console.log(`server listening in port ${PORT}`);

})

【问题讨论】:

  • 想要在相同的端口上运行 react 和 node 吗?
  • 是的,在 3000 端口上!我试过但没有工作。你能帮忙吗?
  • React 不在自己的端口上运行。它在节点上运行,节点在端口 3000 上运行。不清楚你的问题是什么。它以什么方式“不起作用”?你在哪里将 React 注入到你的索引页面中?
  • 您可以在使用一个 nodejs 服务器进行反应 SSR 和 API 服务器时执行此操作。这意味着你不能使用像 create-react-app 这样的工具。你是使用工具还是纯粹的反应?
  • @mihai 使用 React(i.e)Front End 创建了表单。现在必须使用节点 js 服务器发送电子邮件。如果我启动节点服务器,前端将无法正常工作。请检查上面的代码。

标签: javascript node.js reactjs


【解决方案1】:

您无法通过您所遵循的方法实现这一目标。

为什么?

你试图在一个端口上运行两个不同的服务器(节点服务器和 webpackdev 服务器)

还有其他选择吗?

是的,根据您的要求,前端不需要单独的服务器,您可以将其作为静态文件提供。

怎么做?

  1. 构建您的应用程序(用于 create-react-app npm run build

  2. build 文件夹的所有内容复制到您的快速应用程序中的新文件夹(例如public)。

  3. 现在在您的节点 js 代码中添加以下内容(用于提供静态文件):

    app.use('/', express.static('./public'));

现在访问http://localhost:3000

【讨论】:

  • 这样做有什么缺点吗?优点和缺点?这个对我有用。生产安全吗?
  • 我认为在生产中您需要在 package.json 中指定构建react-app 而不是将内容从构建复制到public 文件夹,也许使用 github 操作可以实现这一目标
  • 如何处理 reshresh 案例。假设我有一个端点 /schema,我在浏览器中输入并刷新。但是这个端点将命中后端(节点)并且错误将被抛出为无法获取/模式。如果 API 中不存在端点,如何重定向到公用文件夹。
【解决方案2】:

我假设您正在使用 create-react-app,并且您已将代理配置添加到 package.json。

Create-react-app 在 3000 端口上启动,因此您的 express 服务器应该在任何其他端口(不是 3000)上启动,然后您将代理配置更改为该端口。

即常量 PORT = process.env.PORT || 5000; 比更改前端 package.json 代理配置,如 "proxy": "http://localhost:5000"

请注意,这只能用于开发。对于生产:构建包,并使用 express 从构建文件夹中提供静态内容。

【讨论】:

  • 我做了相应的操作,但收到错误消息“Cannot GET /”
  • @Ameen 检查服务器进程的日志。它是否声明“服务器正在侦听端口 5000”?我在问,因为我刚刚完成了所有这些步骤,一切正常。
  • @Ameen,等等,你是怎么检查的?
  • 是的,得到的状态消息与“服务器正在侦听端口 5000”相同。没有错误
  • 使用 Visual Studio 代码编辑器显示状态并使用 nodemon 重启服务器
【解决方案3】:

如果您使用create-react-app 之类的工具,答案是'不能这样做',因为您无法在生产模式下编辑nodejs 服务器和另一端,create-react-app 构建项目并拥有生产中没有任何nodejs 服务器。

但是当你将 react 开发为 pure 和 SSR 时,你可以访问 nodejs 服务器并且可以做到这一点。

查看此反应 SSR:

https://medium.freecodecamp.org/demystifying-reacts-server-side-render-de335d408fe4

【讨论】:

  • 有人将我发布的问题标记为可能重复。不确定它是否适用,因为我的目标是在一个端口中运行 2 个脚本(单独的文件)。那可能吗? stackoverflow.com/questions/62155391/…
【解决方案4】:

如果你使用 webpack/dev-server 的解决方案

package.json文件:

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

如果你在 webpack 中使用 dev-sever,那么在 webpack.cofing.js 添加这个:

    proxy: {
        '/api': "http://localhost:5000",
    },

backend.js文件:

const server = http.createServer((req, res) => {
  res.write('Hello World!');
  res.end();
});

server.listen({
  host: 'localhost',
  port: 5000,
});

当您打开站点时输入:localhost:8080(或您的默认值),然后当您想打开您的 node.js 服务器时,只需在您的网址中添加 /api,它应该如下所示:localhost:8080/api .

【讨论】:

    【解决方案5】:

    我找到了如何在同一个端口上启动 react 和 nodejs 应用程序的解决方案。 请打开git链接 https://github.com/chandrakant1990/react-node-express-app-on-same-port

    克隆这个 repo。 在客户端 forlder 中只需触发命令 npm 安装 然后启动应用程序 sh start.sh

    您的应用将在 localhost:3000 上启动

    对于客户端更改您无需再次重新启动应用程序。 对于服务器端更改,请重新启动应用程序。

    更多详情可以看视频 https://youtu.be/AiEC2_8mIIY

    【讨论】:

      【解决方案6】:

      我认为使用相同端口实现的唯一方法是使用服务器端渲染。您可以在此处了解更多信息

      https://www.freecodecamp.org/news/demystifying-reacts-server-side-render-de335d408fe4/

      【讨论】:

        猜你喜欢
        • 2017-11-22
        • 2019-05-30
        • 2017-05-12
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 2018-06-15
        相关资源
        最近更新 更多