Socket.io Mejores prácticas de encoding

Estoy desarrollando una aplicación Node.js que usa Socket.io para manejar la comunicación en tiempo real. Mi código está lleno de funciones On y Emit. Yo uso la función de la habitación también. Mi aplicación se ve así:

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

Funciona bien, pero no es mi solución ideal. En primer lugar, en este enfoque, todo está en un archivo grande en lugar de un archivo más pequeño con funcionalidad aislada.

En segundo lugar, es bastante difícil depurar y mantener esta aplicación, ya que es bastante complicada cuando se trata de más de 1000 líneas de código.

Aquí está mi pregunta:

¿Existe alguna práctica preferida / mejor en el desarrollo de aplicaciones Socke.io de calidad empresarial? Si es así, ¿hay alguna aplicación Socket.io de código abierto grande que demuestre este enfoque o algún artículo que me ayude a refactorizar mi código de una mejor manera?

Creo que al comenzar poniendo cada función de callback en una función diferente que pones fuera de io.on (‘conexión’), y quizás también las pongas en un archivo diferente (usando module.exports), comenzarás a tener una aplicación más clara.

Ok, entonces te escribiré una posibilidad que uso, no sé si es el mejor patrón del universo para socket.io, pero creo que eso es bueno.

En su archivo principal (el archivo con io.onconnection), puede tener algo como esto (no tiene que usar el espacio de nombres, es solo un ejemplo):

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

Y en el socketEvent.js que cargues puedes tener esto:

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

Déjame saber si tienes alguna pregunta

Añadir

Si quieres algo como Socket.on (‘evento’, myModule.doSomething);

Puedes hacerlo así, supongo en el módulo:

cliente:

 var myModule = require('./socketModule'); io.on('connection', function (socket) { socket.on('event' , myModule.doSomething(/*some parameters (socket)*/)); }); 

servidor socketModule.js:

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

Para aquellos que se estén preguntando acerca de los parámetros de paso, .bind podría ser una opción

 const events = require('./events.js') io.of('/chat').on('connection', (socket) => { socket.on('print', events.print.bind({socket, io})) }) 

event.js

 const util = require('util') function print(data) { console.log(util.inspect(this.socket).substr(0, 100)) console.log(util.inspect(this.io).substr(0, 100)) } module.exports = { print }