ash
ash

Reputation: 1232

NodeJS EventEmitter

I'm using a modular setup where Socket.IO is no part of my application or routes - but in an external module.

I have a PHP script that receives data and then updates the database. I've set it up to send a cURL request to the node application, and I'd like the route to trigger an event that my socket module listens for to go and emit a socket.io event, and update what the client see's in real-time.

Does an event emit to the entire application or have I gone about my approach all wrong?

Thanks.

Express 3 Route

var events              = require('events');
var event_emitter       = new events.EventEmitter();

router.post('/php-script-calls-this', function(req, res, next) {
    event_emitter.emit('do-socket-event');
    res.sendStatus(200);
});

Socket File (sub-module called in my io.js module)

module.exports = function(io, socket) {

    var events              = require('events');
    var event_emitter       = new events.EventEmitter();

    event_emitter.on("do-socket-event", function() {
      socket.emit("update-client-data");
    });

Upvotes: 0

Views: 1162

Answers (1)

Josh
Josh

Reputation: 1412

I think the issue is that you have 2 separate event emitters. In both modules you're creating an instance of EventEmitter. Is there any particular reason you can't just use the socket from the '/php-script-calls-this' route and emit right from there?

var events              = require('events');
var event_emitter       = new events.EventEmitter();

router.post('/php-script-calls-this', function(req, res, next) {
    socket.emit('update-client-date');
    res.sendStatus(200);
});

If you can't emit to the socket directly from the route, then create the EventEmitter in a module so it can be shared.

my-shared-event-emitter.js

var events = require('events');
module.exports = new events.EventEmitter();

Then in your route file:

var events              = require('events');
var event_emitter       = require('my-shared-event-emitter');

router.post('/php-script-calls-this', function(req, res, next) {
    event_emitter.emit('do-socket-event');
    res.sendStatus(200);
});

And finally the socket file:

module.exports = function(io, socket) {

    var events              = require('events');
    var event_emitter       = require('my-shared-event-emitter');

    event_emitter.on("do-socket-event", function() {
      socket.emit("update-client-data");
    });
}

Upvotes: 1

Related Questions