21

文档说 socket.io 现在不支持 .get .set

是否可以存储客户端相关数据,例如

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

如果我需要多个节点?

4

2 回答 2

28

是的,可以向 socket.iosocket对象添加属性。您应该注意不要使用可能与内置属性或方法冲突的名称(我建议添加前导下划线或使用某种名称前缀对其进行命名)。但是套接字只是一个 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];
    });
});
于 2015-04-29T04:05:36.377 回答
16

是的,只要没有其他同名的内置属性,这是可能的。

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);
    });   
});
于 2015-04-29T04:10:28.367 回答