Socket.io не будет отправлять сообщения в комнаты на discconect

В основном я пытаюсь создать быстрый чат с использованием Node.JS и angular.

Я использовал другие сокеты, и они работали. Я не совсем понимаю, почему они не хотят работать сейчас. Действительно странная вещь заключается в том, что вход в систему работает нормально и довольно хорошо, но когда дело доходит до выхода из системы или даже при использовании моего метода отключения, на стороне сервера ничего не происходит, с функцией отключения, console.log работает отлично. Но это не будет излучать.

На угловой стороне все мои console.logОни работают, но при выходе или отключении не происходит никаких событий на сервере.

Внутри узла у меня есть три события

 socket.on('chat:userLogin', function(user) {
    socket.join('online-users');
    chatRoom[user.id] = user
    console.log('User Has logged in, chat room contains: ', chatRoom);
    io.sockets.in('online-users').emit('chat:usersOnline', chatRoom)
  })

  socket.on('chat:userLogout', function(userId) {
    console.log('User Id ' + userId + 'is logging out');
    delete chatRoom[userId]
    console.log('User Has logged out, chat room contains: ', chatRoom);
    io.sockets.in('online-users').emit('chat:userLeave', chatRoom);
    socket.leave('online-users');
  })

  socket.on('disconnect', function() {
    var userRoom = rooms[socket.roomId]

    if (chatRoom[socket.userId])
      delete chatRoom[socket.userId]

    io.sockets.in('online-users').emit('chat:userLeave', socket.userId);
    console.log('Emitting that users have left to: ', io.sockets.in('online-users'));
    socket.leave('online-users');
  }

И в угловых у меня есть две функции, которые испускают эти два события

  this.logout = function(userId) {
      console.log('Logging user out: ', userId);
      Socket.emit('chat:userLogout', userId);
      console.log('Logged out user?');
      delete this.userStore[userId]
    }

    this.login = function(userId) {
      console.log('Getting online user ', userId);
      var self = this;
      User.get({id: userId}, function(user) {
        self.userStore[userId] = user;
        Socket.emit('chat:userLogin', user);
      });
    }

1 ответ

Это может решить вашу проблему, но вы должны использовать socket.broadcast.to('roomname'), если вы не хотите отправить сообщение всем сокетам в комнате (включая тот, который отправил сообщение). Так что ваш код будет выглядеть примерно так

socket.on('chat:userLogin', function(user) {
   socket.join('online-users');
   chatRoom[user.id] = user
   console.log('User Has logged in, chat room contains: ', chatRoom);
   // emit to everyone else except the sender
   socket.broadcast.to('online-users').emit('chat:usersOnline', chatRoom);
})

socket.on('chat:userLogout', function(userId) {
   console.log('User Id ' + userId + 'is logging out');
   delete chatRoom[userId]
   socket.leave('online-users');
   // leaving the chat room here means we can emit to all people in the room
   io.sockets.in('online-users').emit('chat:userLeave', chatRoom);
   console.log('User Has logged out, chat room contains: ', chatRoom);

})

socket.on('disconnect', function() {
   var userRoom = rooms[socket.roomId]

   if (chatRoom[socket.userId])
      delete chatRoom[socket.userId]

   socket.leave('online-users');
   io.sockets.in('online-users').emit('chat:userLeave', socket.userId);

   console.log('Emitting that users have left to: ', io.sockets.in('online-users'));
}

Проверьте этот вопрос для получения дополнительной информации.

Другие вопросы по тегам