Socket io emit message to client from express controller method

I know that usually you will have to app.js

create a socket server and pass that instance to your router, which in turn can pass it to controller methods. As shown here ( Socket.io emit from Express controllers )

However, I have a controller method that is supposed to give progress to any client that happens to be listening, but that method can be executed from many different routes and other controllers, and I really don't want to pass the link socket

around all these other parts of the application.

Is there a better way to do this?

I was thinking something like a helper module socketio

. The module app.js

transmits a link to io

which you can get later ...

app.js

var io = require('socket.io').listen(server);    
require('./helpers/socketio').set(io);

      

helpers / socketio.js

var io=null;

exports.set = function(socketio) {
   io=socketio;
}

exports.get = function() {
  return io;
}

      

Then when you need it in the application.

var io = require('./helpers/socketio').get();
io.emit('message', {a:1, b:2});

      

Is there a cleaner way to do this? Obviously it can return null, which you will need to check. It just doesn't feel right.

+3


source to share


1 answer


Modules are cached the first time they are loaded.

Actually, you can check socket.io on helper/socketio.js

. Although you call require()

that socketio.js

from other files, node.js will only execute the code in that file once.



You can take a look at Node Documentation

+1


source







All Articles