Socket.io - listen events in separate files in node.js

Nope, just use the same "io" object.

File1.js

exports = module.exports = function(io){
  io.sockets.on('connection', function (socket) {
    socket.on('file1Event', function () {
      console.log('file1Event triggered');
    });
  });
}

File2.js

exports = module.exports = function(io){
  io.sockets.on('connection', function (socket) {
    socket.on('file2Event', function () {
      console.log('file2Event triggered');
    });
  });
}

app.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
  , file1 = require('./File1')(io)
  , file2 = require('./File2')(io)

app.listen(3000);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

index.html

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.emit('file1Event');  // 'file1Event triggered' will be shown
  socket.emit('file2Event');  // 'file2Event triggered' will be shown
</script>

Be careful not to generate a new connection event for each file. You should use the same on('connection') event, otherwise after 10 files imported, you will get this error from node: MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 connection listeners added. Use emitter.setMaxListeners() to increase limit.

The better way is to do like this in your main file:

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

  require('pathToSocketRoutesFile1')(socket);
  require('pathToSocketRoutesFile2')(socket);

  require('pathToSocketRoutesFileN')(socket);

  return io;

};

and in each separate file:

module.exports = function(socket) {

  socket.on('eventName1', function() {
    //...
  });

  socket.on('eventName2', function() {
    //...
  });

};

Another option is to create a rootSocket which handles the initial connection and then passes the socket to other handlers.

const rootSocket = (io) => {
    io.sockets.on('connection', (socket) => {
        authorization(socket);
        chat(socket);
    });
};
exports.default = rootSocket;

You Can use IO module in any route just create global middleware.

socketiomw.js

 module.exports = (io)=>{
      return (req,res,next)=>{
        req.io = io;
        next();
      }
  }

middlewares.js

module.exports.global = {
  socketIo:require('./socketiomw'),
  // add other global middleware
};

index.js

const express = require('express');
const app = express();
const port = 3000;
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);  
//global middleware initialization
app.use(require('./middlewares').global.socketIo(io));

app.get('/notify',(req,res)=>{ 
   req.io.emit("hello");
   req.io.to("someRoom").emit("some event");
   req.io.to("room1").to("room2").to("room3").emit("some event");
   req.io.of("/").adapter.on("create-room", (room) => { 
       console.log(`room ${room} was created`);
   });
   req.io.of("/").adapter.on("join-room", (room, id) => {  
      console.log(`socket ${id} has joined room ${room}`);
   });
   req.json({ success:true }) 
);

server.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

I used this in global middleware so i can use this io module in any routes