Mieux organiser ses sockets avec express.js

Si vous avez déjà utilisé les sockets dans une application node.js, vous vous êtes surement déjà retrouvé dans un cas où votre fichier principal deviens plutôt long et mal organisé.

J’ai une solution simple à ce problème. En effet, lorsque l’on cherche un peu les documentations sur les sockets avec express.js on retrouve souvent ce schéma :

var express = require('express');

var app = express();

/*
** la configuration d'express, les routes etc.
*/

//Déclaration du serveur
var server = http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

var io = require('socket.io').listen(server);

//Et là c'est la catastrophe

io.configure(function (){
 //On gère l'authentification par exemple
});

io.sockets.on('connection', function (socket) {
    //Nos listeners, emiters
	socket.on('action', function() {
   
    });
});

Rien que dans cet exemple, très simplifié, le fichier app.js est bordélique et comporte bien trop de choses différentes : les routes, les middlewares, les actions des sockets.

Nous alons alors exporter les sockets afin de pouvoir déclarer les actions dans un fichier distinct.

A la place de :

var io = require('socket.io').listen(server);

On utilise tout simplement notre fichier sockets :

require('./sockets').listen(server);

Puis notre sockets.js ressemble à ça :

var socketio = require('socket.io');

module.exports.listen = function(server) {
	var io = socketio.listen(server);
    
     io.sockets.on('connection', function (socket) {
     	
        //On place nos events ici
     	socket.on('action', function() {
        
		});

		/*
        ** Notez qu'il est possible d'inverser le processus 
		** pour permettre à d'autres fichiers d'utiliser le même socket
		** par exemple :
		*/
		require('un/autre/fichier').sockets(socket, io.sockets);
             
		/*
    	** J'exporte le socket ainsi que les sockets 
    	** pour permettre d'envoyer à tous les clients par exemple
    	*/
        
     });
});

Dans ce cas, notre un/autre/fichier ressemblerai à ça :

module.exports.sockets = function(socket, sockets) {
	socket.on('chat:message', function() {
		sockets.emit('chat:receivedMessage');
	});
});

Simple, organisé et très pratique n’est-il pas ?!