2014-06-11 19 views
10

Sto sviluppando un'applicazione Node.js che utilizza Socket.io per gestire la comunicazione in tempo reale. Il mio codice è pieno di funzioni On ed Emit. Uso anche la funzione stanza. la mia app è simile a questa:Socket.io Migliori pratiche di codifica

var server = require('http').Server(); 
    var io = require('socket.io')(server); 
    io.on('connection', function(socket){ 
     socket.on('event1', function(data){"lots of socket and non-socket codes" }); 
     socket.on('event2', function(data){"lots of socket and non-socket codes" }); 
     socket.on('event3', function(data){"lots of socket and non-socket codes" }); 
     socket.on('disconnect', function(){"Some other code"}); 
    }); 
    server.listen(portNum); 

funziona bene ma non è la mia soluzione ideale. In primo luogo, in questo approccio tutto è in un unico file piuttosto che in un file più piccolo con funzionalità isolate.

in secondo luogo, è piuttosto difficile eseguire il debug e mantenere questa app in quanto è piuttosto caotica quando si tratta di oltre 1000 linee di codice.

Ecco la mia domanda:

C'è una migliore pratica preferita/sullo sviluppo di applicazioni Socke.io qualità aziendale? Se sì, esiste una grande applicazione Socket.io opensource che demonstrait questo approc o qualsiasi articolo che mi aiuti a rifattorizzare il mio codice in un modo migliore?

+0

penso di iniziare mettendo ogni funzione di callback in un diverso funzione che hai messo fuori da io.on ('connessione'), e magari anche metterli in un file diverso (usando module.exports), inizierai ad avere un'applicazione più chiara. – Jujuleder

+0

@Jujuleder è esattamente quello di cui ho bisogno. Ma mi piacerebbe sapere come ciò possa essere ottenuto mantenendo l'oggetto socket in tutti i moduli. – Raiss

risposta

5

Penso che iniziando mettendo ogni funzione di callback in una funzione diversa che si mette fuori da io.on ('connessione'), e magari anche inserendoli in un file diverso (usando module.exports), si inizierà ad avere un'applicazione più chiara.

Ok così ti scriverò una possibilità che uso, non so se è il miglior modello dell'universo per socket.io, ma questo è buono penso.

Nel file principale (il file con io.onconnection), si può avere qualcosa di simile (non dovete usare namespace, è solo un esempio):

var SocketEvent = require('./socketEvent'); 

io.of('/user').on('connection', function (socket) { 

    SocketEvent.load_common_event(socket); 
    SocketEvent.load_user_event(socket); 

}); 

io.of('/operator').on('connection', function (socket) { 

    SocketEvent.load_common_event(socket); 
    SocketEvent.load_operator_event(socket); 

}); 

E nelle socketEvent.js che si carica si può avere questo:

exports.load_common_event = function(socket){ 
    socket.on('disconnect', function(){"Some other code"}); 
}; 

exports.load_user_event = function(socket){ 
    socket.on('event1', function(data){"lots of socket and non-socket codes" }); 
    socket.on('event2', function(data){"lots of socket and non-socket codes" }); 
    socket.on('event3', function(data){"lots of socket and non-socket codes" }); 
}; 

exports.load_operator_event = function(socket){ 
    socket.on('event4', function(data){"lots of socket and non-socket codes" }); 
    socket.on('event5', function(data){"lots of socket and non-socket codes" }); 
    socket.on('event6', function(data){"lots of socket and non-socket codes" }); 
}; 

fatemi sapere se avete qualunque domanda

Add-on

Se si desidera qualcosa come Socket.on ('evento', myModule.doSomething);

si può fare in questo modo credo che nel modulo:

client:

var myModule = require('./socketModule'); 

io.on('connection', function (socket) { 

    socket.on('event' , myModule.doSomething(/*some parameters (socket)*/)); 

}); 

socketModule.js del server:

exports.doSomething = function(/*some parameters (socket)*/){ 
    /* Some processing around */ 
}; 
+0

Grazie, Sebbene non utilizzi più punti Socket End, l'approccio sopra riportato è piuttosto interessante. – Raiss

+0

Sarei più interessato ad avere qualcosa come 'Socket.on ('event', myModule.doSomething);' Non sono sicuro di come dovrebbe essere scritto myModule. – Raiss

+0

Ho modificato, dimmi se questo è buono o no – Jujuleder