React / NodeJS не будет говорить через локальный хост в разработке - PullRequest
0 голосов
/ 08 ноября 2019

Я работаю над настройкой внутреннего узла Node для подачи данных и связи с ReactJS для моего внешнего интерфейса. В конечном итоге я разрабатываю новое программное обеспечение компании для замены нашей нынешней Транспортной системы.

Я использую Amazon EC2 Ubuntu 16.04 - по своим собственным причинам для своего бизнеса - и я просто не могу заставить свой интерфейс ReactJS с Socket.IO общаться смой сервер nodeJS с Socket.IO на http://localhost:4000/.

Это мой 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-адрес, но не через localhost. Я действительно не хочу показывать свой бэкенд на своем общедоступном IP-адресе для связи с ним для всех пользователей. Вероятно, об этом уже спрашивали, но я, честно говоря, нигде не могу найти четкого ответа, и вот уже 3 дня ищуУ Node нет проблем с выполнением, и, как я уже сказал, если я создаю соединение socket.io с общедоступного IP-адреса, я могу заставить его взаимодействовать, и, насколько я могу судить, у узла нет проблем с запуском остальной части скрипта, когда он подключается к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

В настоящее время я запускаю React через npm start, поэтому мой localhost: 3000обратный прокси к nginx, чтобы мой интерфейс React был виден на моем общедоступном IP-адресе EC2 через порт 80.

Любая помощь приветствуется!

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Это может быть проблема запроса кросс-источника. Вы пытались включить CORS в своем приложении. Вы также можете использовать прокси в своем приложении реагирования package.json, если не хотите включать cors в своем приложении.

В вашем пакете реакции приложения.json вы можете добавить

"proxy":"http://localhost:4000"
0 голосов
/ 08 ноября 2019

Просто немного почистите свой сервер. Попросите этого парня запустить его из любого терминала или компьютера, который вы используете для запуска сервера.

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, чтобы обслужить этого парня.

0 голосов
/ 08 ноября 2019

Вероятно, потому, что используемый вами порт недоступен на стороне сервера, когда он работает.

Используйте серверный порт, например,

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...