клиент javscript socket.io не получает событие - PullRequest
0 голосов
/ 05 апреля 2020

Итак, я пытаюсь настроить чат socket.io с expressjs backend и svelte js frontend.
У меня есть собственное пространство имен под названием 'chat', и я создаю новую комнату на Запрос на присоединение.
Я пытался очень внимательно придерживаться официальной документации.

Вот мой код:
Сервер:

const app = express();
const server = app.listen(3002);
log.info("Express server has started on port 3002");
const io = require("socket.io")(server, { path: "/api/express/socket.io" });
const chat = io.of("/chat");
chat.on("connection", socket => {
  log.info("New User connected");
  socket.on("join", room => {
    log.info("New User joined room: " + room);
    socket.join(room);
  });
  socket.on("chat message", data => {
    log.info("'chat-message'-Event: ", data);
    chat.in(data.room).emit("chat message", {
      room: data.room,
      msg: data.msg,
      user: data.user
    });
  });
});

Клиент:

let chatSocket
onMount(async () => {
    chatSocket = io('https://my.domain.com/chat', {
      path: '/api/express/socket.io',
      transports: ['websocket'],
    })
    chatSocket.on('connection', function(socket) {
      socket.on('chat message', function(data) {
         alert(data.msg)
      })
    })
    chatSocket.emit('join', 'Chat-Room#' + id)
  })
  const Submit = async e => {
    chatSocket.emit('chat message', {
      room: 'Chat-Room#' + id,
      msg: statusText,
      user,
    })
  }

Судя по выводу консоли сервера, все выглядит нормально. Все события запускаются правильно и записываются на консоль. Но клиенты, похоже, не получают никаких событий «чата» (они отправляют их просто отлично).
Есть идеи, что здесь не так?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Хорошо. Таким образом, очевидно, что проблема была в неправильной конфигурации обратного прокси nginx. Я добавил заголовки «upgrade» и «connection» для сервера, но не для клиента. Исправление, которое решило проблему.

0 голосов
/ 05 апреля 2020
chatSocket.on('connection', function(socket) {
      socket.on('chat message', function(data) {
         alert(data.msg)
      })
    })

Вы регистрируете событие 'connection', событие, которое не существует, по крайней мере, в последней версии socketIO. Эта функция никогда не срабатывает. Кроме того, даже если бы он существовал, вам все равно нужно будет использовать исходный «chatSocket», который вы уже установили, а не «socket».

Измените этот фрагмент кода на:

chatSocket.on('connect', function() {
      chatSocket.on('chat message', function(data) {
         alert(data.msg)
      })
    })

Возможно, что в более старых версиях socketIO существовало событие "подключения", вам нужно взглянуть на документы: https://socket.io/docs/client-api/#Event -% E2% 80% 98connect% E2% 80% 99

Обратите внимание, что имена событий во внешнем интерфейсе и на сервере не совпадают. У вас есть отдельные документы для каждого.

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