Я решил начать с простого чата. На самом деле была проблема. Итак, у меня есть объект ChatServer, который реализует объект, созданный socket.io, и работает с подключением и отключением клиентов.Как удалить объект в Node.JS?
"use strict";
var SocketServer = require('socket.io')
, Client = require('./Client.js');
class ChatServer {
constructor(app, http) {
var io = SocketServer(http)
, clients = {};
io.on('connection', function(socket) {
console.log('Client ' + socket.id + ' connected');
clients[socket.id] = new Client(app, socket);
socket.on('disconnect', function() {
console.log('Client ' + socket.id + ' disconnected');
clients[socket.id] = undefined;
delete clients[socket.id];
});
});
}
}
module.exports = ChatServer;
При подключении клиентского объекта создается Клиент, который выполняет обработку сообщений для этого конкретного клиента.
"use strict";
class Client {
constructor(app, socket) {
this.app = app;
this.socket = socket;
this.app.on('chat.sendMessage', this.sendMessage.bind(this));
}
sendMessage(message) {
console.log('Client ' + this.socket.id + ' on chat.sendMessage');
this.socket.emit('chat.sendMessage', message);
}
}
module.exports = Client;
приложение - это EventEmitter, откуда приходят периодически «chat.sendMessage» сообщения (для тестирования), в объектах клиента, сообщения принимаются и направляются в браузере.
Однако, если клиент отключен, клиентский объект не уходит и продолжает ловить сообщения и отправлять их в отсоединенный сокет.
Client ZbEFj8ykXba9CxLiAAAA connected
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA disconnected
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
я, вероятно, не в полной мере понять механику destroing объектов, я знаю, что ему нужно, чтобы удалить все ссылки на него, что здесь и сделано.
clients[socket.id] = undefined;
delete clients[socket.id];
Однако это не работает. Что я делаю не так?