web-dev-qa-db-ja.com

クライアント関連データをsocket.io 1.0に保存する方法

ドキュメントは、socket.ioは現在.get .setをサポートしていないと言います

次のようなクライアント関連データを保存しても大丈夫ですか

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

複数のノードが必要な場合?

16
Herokiller

はい、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];
    });
});
24
jfriend00

はい、同じ名前の組み込みプロパティが他にない限り可能です。

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 weak maps

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);
    });   
});
13
code-jaff