2013-12-09 15 views
9

Per il mio REST API ho creato un file per ogni percorso.come organizzare la gestione socket in node.js e socket.io app

app.get('/api/user', routes.user.index); 
app.get('/api/user/login', routes.user.login); 

ecc, ecc

Ora sto introducendo socket.io al backend e sembra che posso chiamare una sola funzione per tutti gli eventi socket.

var socket = require('./socket/stuff.js'); 

io.sockets.on('connection', function(sock){ 
    socket.stuff(sock, io); 
}); 

Come devo spezzare il file ./socket/stuff.js (che esporta stuff). In file separati. Mi piacerebbe alla fine sostituire la mia API REST con i socket, ma non voglio che tutto sia in un unico file.

immagino che avrei dovuto:

./socket/chat.js 
./socket/user.js 

ecc ecc

risposta

13

Per organizzare i gestori di eventi in file diversi, è possibile utilizzare una struttura come questa:

./main. js

var io = require('socket.io'); 
var Chat = require('./EventHandlers/Chat'); 
var User = require('./EventHandlers/User'); 

var app = { 
    allSockets: [] 
}; 

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

    // Create event handlers for this socket 
    var eventHandlers = { 
     chat: new Chat(app, socket), 
     user: new User(app, socket) 
    }; 

    // Bind events to handlers 
    for (var category in eventHandlers) { 
     var handler = eventHandlers[category].handler; 
     for (var event in handler) { 
      socket.on(event, handler[event]); 
     } 
    } 

    // Keep track of the socket 
    app.allSockets.push(socket); 
}); 

./EventHandlers/Chat.js

var Chat = function (app, socket) { 
    this.app = app; 
    this.socket = socket; 

    // Expose handler methods for events 
    this.handler = { 
     message: message.bind(this) // use the bind function to access this.app 
     ping: ping.bind(this) // and this.socket in events 
    }; 
} 

// Events 

function message(text) { 
    // Broadcast message to all sockets 
    this.app.allSockets.emit('message', text); 
}); 

function ping() { 
    // Reply to sender 
    this.socket.emit('message', 'PONG!'); 
}); 

module.exports = Chat; 
+0

Che aspetto avrebbe 'chat.js' per un gestore di eventi socket di esempio? – chovy

+0

@chovy Si prega di vedere la mia risposta aggiornata –

+0

ho finito per fare qualcosa di simile. Ma chiamo semplicemente 'require ('./ socket'). Register (sock, io)' e che ha una funzione che chiama entrambe le funzioni 'register' esportate da'./Chat.js' e './User.js' – chovy