React + Socket.IO / Экспресс на Heroku - PullRequest
       8

React + Socket.IO / Экспресс на Heroku

0 голосов
/ 06 сентября 2018

Я использую Heroku для размещения своего приложения React на сервере Express / Socket.IO. На localhost все работает, но при развертывании на Heroku не работает (без ошибок на консоли)

Клиент

export default class Client extends Component {
    constructor() {
        super()
     /* on localhost: 
        this.socket = io('localhost:5001') */
        this.socket = io()
    }

    componentDidMount() {
        this.socket.on('...', () => {
            ...
        })
    }

    componentWillUnmount() {
        this.socket.disconnect()
    }

    render() {
        return (
            <div>
              Client
            </div>
        )
    }
}

Сервер

const express = require('express');
const path = require('path');
const PORT = process.env.PORT || 5000;
const app = express();
const bodyParser = require('body-parser');
require('dotenv').config();

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

app.use(express.static(path.resolve(__dirname, '../react-ui/build')));

require('./socket.js')(app)

    // All remaining requests return the React app, so it can handle routing.
app.use('', function (req, response, next) {
  response.sendFile(path.resolve(__dirname, '../react-ui/build', 'index.html'));
});

app.listen(PORT, function () {
  console.error(`Listening on port ${PORT}`);
});

socket.js

module.exports = function (app) {
    const http = require('http')
    const socketIO = require('socket.io')
    const server = http.createServer(app)
    const io = socketIO(server)

    io.set('origins', '*:*');
    io.on('connection', function (client) {
       console.log('user connected')
    })

    /* on localhost:
       server.listen(5001, 'localhost') */
}

1 Ответ

0 голосов
/ 06 сентября 2018

Дело в том, что сокет io должен где-то слушать. Параметр app, который вы передаете, ничего не слушает, поэтому вам нужно присоединить app.listen к переменной, а затем передать эту переменную в функцию socket.js. Затем вы подключаетесь напрямую к серверу socketio.

Псевдокод ниже:

Сервер

let server = app.listen(port)
require('./sockets.js')(server)

socket.js

module.exports = function (server) {
const socketIO = require('socket.io')
const io = socketIO(server)
io.set('origins', '*:*');
io.on('connection', function (client) {
   console.log('user connected')
})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...