2015-04-29 8 views
9

La documentazione dicono socket.io non supporta .get .set oraCome conservare cliente dati associati nel socket.io 1.0

Va bene per client archivio di dati associati come

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

in caso ho bisogno di più nodi?

+0

Qual è il 'Client' variabili? Ti manca un po 'di contesto qui per chiunque sia in grado di rispondere. – jfriend00

+0

@ jfriend00 aggiornato – Herokiller

risposta

15

Sì, è possibile aggiungere le proprietà all'oggetto socket.io socket. Dovresti fare attenzione a non usare nomi che potrebbero entrare in conflitto con proprietà o metodi incorporati (ti consiglio di aggiungere un trattino basso principale o di attribuirli con una sorta di prefisso del nome). Ma un socket è solo un oggetto Javascript e sei libero di aggiungere proprietà come questo finché non crei conflitti con le proprietà esistenti.

Esistono altri modi per utilizzare lo socket.id come chiave nella propria struttura dati.

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]; 
    }); 
}); 
+1

questa informazione è disponibile al client per vedere/mutare? –

+0

@Alex_Nabu - No. I dati come quelli contenuti nell'oggetto 'curentConnections' sono dati lato server e sono privati ​​del server. – jfriend00

+1

scusa significava se dovessi collegare i dati al socket obj se è mutabile al client. Ora che vedo quello che hai fatto. Ho avuto un momento duale –

8

Sì, è possibile fino a quando non ci sono altre proprietà incorporate con lo stesso nome.

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; 
    });  
}); 

io suggerirei un altro modo, ma con 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); 
    }); 
}); 
Problemi correlati