socket.io получает ошибку 404 при обмене данными между клиентом и сервером - PullRequest
0 голосов
/ 04 марта 2020

Я создаю маленькое приложение для чата с использованиемact, node и socket.io. Я хочу запустить приложение на http://localhost: 3002 / chat-io / , но получаю следующее ошибка:

GET http://localhost:3002/chat-io/socket.io/?EIO=3&transport=polling&t=N2YJ1pG 404 (Not Found)

Сервер:

const express = require('express');
const path = require('path');

const app = express();

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

io.path('/chat-io/socket.io');
const cors = require('cors');

const {
  addUser,
  removeUser,
  getUser,
  getUsersInRoom,
} = require('./users');

// Cors
app.use(cors());

// Serve static assets in production
if (process.env.NODE_ENV === 'production') {
  app.use('/chat-io/', express.static(path.join(__dirname, '/client/build')));
}

app.get('/', (req, res) => {
  res.status(200).send({ response: 'Server is up and running' });
});

io.on('connection', (socket) => {
  socket.on('join', ({ name, room }, callback) => {
    const { error, user } = addUser({ id: socket.id, name, room });

    if (error) return callback(error);

    socket.join(user.room);
    socket.emit('message', { user: 'admin', text: `${user.name}, welcome to the room ${user.room}` });
    socket.broadcast.to(user.room).emit('message', { user: 'admin', text: `${user.name} has joined` });

    io.to(user.room).emit('roomData', { room: user.room, users: getUsersInRoom(user.room) });

    return callback();
  });

  socket.on('sendMessage', (message, callback) => {
    const user = getUser(socket.id);

    io.to(user.room).emit('message', { user: user.name, text: message });
    io.to(user.room).emit('roomData', { room: user.room, users: getUsersInRoom(user.room) });

    return callback();
  });

  socket.on('disconnect', () => {
    const user = removeUser(socket.id);

    if (user) {
      io.to(user.room).emit('message', { user: 'admin', text: `${user.name} has left.` });
    }
  });
});

server.listen(process.env.PORT || 3002, () => {
  console.log(`Server has started on port ${process.env.PORT || 3002}`);
});

Клиент:

const Chat = ({ location }) => {
  const [name, setName] = useState('');
  const [room, setRoom] = useState('');
  const [messages, setMessages] = useState([]);
  const [message, setMessage] = useState('');
  const [users, setUsers] = useState('');

  const ENDPOINT = 'http://localhost:3002';

  useEffect(() => {
    const { name, room } = queryString.parse(location.search);
    socket = io(ENDPOINT, { path: '/chat-io/socket.io' });
    setName(name);
    setRoom(room);

    socket.emit('join', { name, room }, (error) => {
      if (error) alert(error);
    });
  }, [ENDPOINT, location.search]);

  useEffect(() => {
    socket.on('message', (message) => {
      setMessages([...messages, message]);
    });

    socket.on('roomData', ({ users }) => {
      setUsers(users);
    });

    return () => {
      socket.emit('disconnect');
      socket.off();
    };
  }, [messages]);

  const sendMessage = (e) => {
    e.preventDefault();
    if (message) socket.emit('sendMessage', message, () => setMessage(''));
  };
};

На клиенте также есть некоторые jsx, но я не не думаю, что это важно. Я могу заставить код нормально работать на http://localhost: 3002 , но я хочу запустить его на http://localhost: 3002 / chat-io /

Кто-нибудь знает, что я делаю не так? Спасибо

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