Добавление socket.io в существующий проект Express (с React на передней панели) - PullRequest
0 голосов
/ 14 октября 2019

У меня есть проект, написанный на Express, где я создал систему обмена сообщениями. Все работало по методам POST / GET (для отправки и получения сообщений). Я хотел, чтобы они отображались в реальном времени, поэтому я установил socket.io как на стороне клиента, так и на стороне сервера. В моем server.js я добавил эти строки:

const http = require("http");
const io = require("socket.io");
const server = http.createServer();
const socket = io.listen(server);

и изменил мой app.listen(...) на server.listen(...). Добавлено также:

socket.on("connection", socket => {
    console.log("New client connected");
    socket.on('test', (test) => {
        console.log('test-test')
    });

    socket.emit('hello', {hello:'hello!'});

        socket.on("disconnect", () => console.log("Client disconnected"));
});

На лицевой части я поместил такой код в методе componentDidMount:

const socket = socketIOClient();
socket.emit('test', {test:'test!'})
socket.on('hello', () => {
    console.log('aaa')
})

Теперь у меня 2 проблемы. Хотя console.log () работает правильно, я получаю сообщение об ошибке в приложении React:

WebSocket connection to 'ws://localhost:3000/sockjs-node/039/lmrt05dl/websocket' failed: WebSocket is closed before the connection is established.

Это нормально?

Кроме того, когда я изменяю app.listen(...) на server.listen(...)в файле server.js моя маршрутизация перестает работать. Все методы POST и GET не работают, потому что сервер отвечает бесконечно. Можно ли использовать socket.io только для определенного метода в определенном файле маршрутизации?

Я сохраняю свои маршруты таким образом: app.use('/api/user', user);, где user - файл маршрутизатора.

UPDATE: full server.js требует:

const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const bodyparser = require('body-parser');
const passport = require('passport');

const user = require('./routes/api/v1/User');
const company = require('./routes/api/v1/Company');

const http = require("http");
const io = require("socket.io");


const app = express();

dotenv.config();
app.use(passport.initialize());
require('./config/seed');

require('./config/passport')(passport);
const server = http.createServer();
const socket = io.listen(server);

1 Ответ

0 голосов
/ 14 октября 2019

Вы неправильно инициализируете сервер. Попробуйте внести следующее изменение

// const server = http.createServer();
const server = http.createServer(app);

и убедитесь, что вы слушаете server, а не io

server.listen(PORT_GOES_HERE)

[ОБНОВЛЕНИЕ] Рабочий пример:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);
// WARNING: app.listen(80) will NOT work here!

// DO STUFF WITH EXPRESS SERVER
app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

Для более подробной информации проверьте это: https://socket.io/docs/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...