Javascript React/NodeJS-won';在开发中不能通过localhost说话

Javascript React/NodeJS-won';在开发中不能通过localhost说话,javascript,node.js,reactjs,sockets,socket.io,Javascript,Node.js,Reactjs,Sockets,Socket.io,我正在为我的前端设置一个节点后端,以提供数据并与ReactJS通信。最终,我正在开发新的公司软件,以取代我们目前的运输系统 我使用Amazon EC2 Ubuntu 16.04——出于我自己的业务原因——我无法让我的带有Socket.IO的ReactJS前端与打开Socket.IO的nodeJS后端通信 这是我的react前端中的App.js,当它调用时 import React, { Component } from 'react'; import logo from './logo.svg'

我正在为我的前端设置一个节点后端,以提供数据并与ReactJS通信。最终,我正在开发新的公司软件,以取代我们目前的运输系统

我使用Amazon EC2 Ubuntu 16.04——出于我自己的业务原因——我无法让我的带有Socket.IO的ReactJS前端与打开Socket.IO的nodeJS后端通信

这是我的react前端中的App.js,当它调用时

import React, { Component } from 'react';
import logo from './logo.svg';
import ioClient from 'socket.io-client';
import './App.css';

var socket;

class App extends Component {

  constructor() {
    super();
    this.state = {
      endpoint: 'http://localhost:4000/'
    };
    socket = ioClient(this.state.endpoint);
  }
这是后端的nodeJS索引

const mysql = require('mysql');
const http = require('http');
const express = require('express');
const cors = require('cors');

const app = express();
const server = http.createServer(app);
const io = require('socket.io').listen(server);

app.use(cors());

app.get('/', (req, res) => {
    res.send('Server running on port 4000')
});

const sqlCon = mysql.createConnection({
    host: 'localhost',
    user: 'admin-user',
    password: 'admin-pass',
    database: 'sample'
});

sqlCon.connect( (err) => {
    if (err) throw err;
    console.log('Connected!');
});

io.on('connection', (socket) => {
    console.log('user connected');
});

server.listen(4000, "localhost", () => {
    console.log('Node Server Running on 4000')
});
我可以让它通过我的实际公共IP地址进行通信,但不能通过本地主机。我真的不想在我的公共IP地址上公开我的后端,以便与所有用户进行通信。以前可能有人问过这个问题,但我真的在任何地方都找不到一个明确的答案,我已经找了3天了。Node在执行时没有问题,正如我所说的,如果我从公共IP创建socket.io连接,我可以让它通信,并且据我所知,Node在连接到mariaDB时运行脚本的其余部分没有问题

这是我在Chrome控制台中不断收到的错误

polling-xhr.js:271 GET http://localhost:4000/socket.io/?EIO=3&transport=polling&t=MvBS0bE net::ERR_CONNECTION_REFUSED
polling-xhr.js:271 GET http://localhost:4000/socket.io/?EIO=3&transport=polling&t=MvBS3H8 net::ERR_CONNECTION_REFUSED
目前我正在通过npm start运行React,因此我的localhost:3000被反向代理到nginx,以便我的React前端通过端口80在我的公共EC2 IP上可见


感谢您的帮助

这可能是因为您正在使用的端口在服务器端运行时不可用

像这样使用服务器端端口

var port = process.env.PORT || 3000;
server.listen(port, "localhost", () => {
    console.log('Node Server Running on 4000')
});
在客户端,只需连接到应用程序URL

this.state = {
  endpoint: '/'
};
socket = ioClient(this.state.endpoint);

只需稍微清理一下服务器。让这家伙从你用来启动服务器的终端或ide上运行他

let startTime = Date.now();
const express = require('express');
const bodyParser = require('body-parser');
const compression = require('compression');
var cors = require('cors');
const app = express();
app.use(compression());
app.use(bodyParser.json({ limit: '32mb' }));
app.use(bodyParser.urlencoded({ limit: '32mb', extended: false }));
const http = require('http').Server(app);
const io = require('socket.io')(http);
app.use(cors({ origin: 'null' }));
const request = require('request');
const port = 4000;
let pm2InstanceNumber = parseInt(process.env.NODE_APP_INSTANCE) || 0;
http.listen(port + pm2InstanceNumber, err => {
    if (err) {
        console.error(err);
    }
    console.log('Listening http://localhost:%d in %s mode', port + pm2InstanceNumber);
    console.log('Time to server start: ' + (Date.now() - startTime) / 1000.0 + ' seconds');
    setTimeout(() => {
        try {
            process.send('ready');
        } catch (e) {}
    }, 2000);

    app.get('/', (req, res) => {
        res.send('Server running on port 4000')
    });
});

或者运行
node filename.js
为这个家伙服务。

这可能是一个跨源请求问题。您是否尝试在应用程序上启用CORS。如果不想在应用程序上启用cors,也可以在react应用程序
package.json中使用代理

在react app package.json中,您可以添加

"proxy":"http://localhost:4000"

关于网络技术,如果你试图创建一个本地系统,你需要连接到你的服务器的主机ip。例如,您有一个本地网络,服务器运行节点的本地ip为192.168.1.190,您的SocketIO应该连接到该本地ip地址以在本地运行所有系统。如果我正确理解您的问题。我尝试使用此选项并安装了所需的依赖项,而节点甚至不会使用此代码启动。我的节点服务器上启用了CORS,但我仍然遇到此错误。我不认为这有什么意义。如果我使用端点“/”,我将只连接到我的客户端前端,因为我已将REACT的开发端口3000转发到nginx的该位置。我正在寻找REACT以使用本地主机连接到我的后端节点,这样我就不必将节点暴露到公共IP地址。因此,这让我想到将我的nodeJS服务器反向代理到nginx,并尝试从指定的端点('/nodeJS/')调用我的端点,但这也不起作用,可能存在代理阻塞或其他问题。。。你能检查一下你是否能从你的react应用程序连接到你的ip:端口,比如你的本地主机ip,比如192.168.45.42:3000。