Как хранить связанные с клиентом данные в socket.io 1.0

Документы говорят, что socket.io сейчас не поддерживает.get .set

Это нормально для хранения данных, связанных с клиентом, как

io.sockets.on('connection', function (client) {
    client.on('data', function (somedata) {            
        client['data'] = somedata;
    });    
});

в случае, если мне нужно несколько узлов?

2 ответа

Решение

Да, это нормально, чтобы добавить свойства в socket.io socket объект. Вы должны быть осторожны, чтобы не использовать имена, которые могут конфликтовать со встроенными свойствами или методами (я бы предложил добавить начальное подчеркивание или область имен с некоторым префиксом имени). Но сокет - это просто объект Javascript, и вы можете добавлять в него такие свойства, если вы не конфликтуете с существующими свойствами.

Есть и другие способы сделать это, используя socket.id как ключ к вашей собственной структуре данных.

var currentConnections = {};
io.sockets.on('connection', function (client) {
    currentConnections[client.id] = {socket: client};
    client.on('data', function (somedata) {  
        currentConnections[client.id].data = someData; 
    });    
    client.on('disconnect', function() {
        delete currentConnections[client.id];
    });
});

Да, это возможно, если нет других встроенных свойств с таким же именем.

io.sockets.on('connection', function (client) {
    client.on('data', function (somedata) {  
        // if not client['data']  you might need to have a check here like this
        client['data'] = somedata;
    });    
});

Я бы предложил другой способ, но с ECMAScript 6 слабых карт

var wm = new WeakMap();

io.sockets.on('connection', function (client) {
    client.on('data', function (somedata) {   
        wm.set(client, somedata);
        // if you want to get the data
        // wm.get(client);
    }); 
    client.on('disconnect', function() {
        wm.delete(client);
    });   
});
Другие вопросы по тегам