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'));
}
Проверьте этот вопрос для получения дополнительной информации.