如何在socket.io 1.0中存储客户端关联数据

Her*_*ler 15 node.js socket.io socket.io-1.0 socket.io-redis

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

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

io.sockets.on('connection', function (client) {
    client.on('data', function (somedata) {            
        client['data'] = somedata;
    });    
});
Run Code Online (Sandbox Code Playgroud)

如果我需要多个节点?

jfr*_*d00 23

是的,可以向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];
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这个信息可供客户查看/变异吗? (2认同)
  • @Alex_Nabu - 这里的`socket` obj 是服务器本地的。您放在上面的任何属性都不能以任何方式提供给客户端。这是真正的客户端/服务器。客户端看到的唯一东西是服务器明确发送给它的东西。socket.io 不会对客户端和服务器之间的套接字属性进行任何神奇的同步。 (2认同)

cod*_*aff 12

是的,只要没有其他具有相同名称的内置属性,这是可能的.

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;
    });    
});
Run Code Online (Sandbox Code Playgroud)

我建议采用另一种方式,但使用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);
    });   
});
Run Code Online (Sandbox Code Playgroud)