Node event emitter in other modules

2019-08-10 07:55发布

问题:

I have 3 different javascript files, the smallest one is emitting an event, meanwhile the second (bigger one) file picks up the event and sends it further to the main file. This is what I have tried so far:

//mini.js
var EventEmitter = require('events').EventEmitter;
var ee = new EventEmitter;

console.log("Emitting event");
var message = "Hello world";
ee.emit('testing',message);


//second.js
var mini = require('./mini.js');
var EventEmitter = require('events').EventEmitter;
var ee = new EventEmitter;

mini.on('testing',function(message){
    console.log("Second file received a message:",message);

    console.log("Passing further");
    ee.emit('testing',message);
});

//main.js
var sec = require('./second.js');

sec.on('testing',function(message){
    console.log("Main file received the message",message);
});

However, I get

mini.on('testing',function(message){
        ^
TypeError: undefined is not a function

error when executing the file with node.

What am I doing wrong here? Thanks

回答1:

This one should work :

This is the content to put inside first.js :

//first.js
var util = require('util'),
    EventEmitter = require('events');


function First () {
  EventEmitter.call(this)
}
util.inherits(First, EventEmitter);


First.prototype.sendMessage = function (msg) {    
  this.emit('message', {msg:msg});
};


module.exports = First;

This is the content to put inside second.js :

//second.js
var First = require('./first.js');
var firstEvents = new First();

// listen for the 'message event from first.js'
firstEvents.on('message',function(data){
    console.log('recieved data from first.js is : ',data);
});


// to emit message from inside first.js
firstEvents.sendMessage('first message from first.js');

Now run node second.js and you should have the 'message' event fired for you.

You can use this pattern to achieve any level of messaging between modules.

Hope this helps.



回答2:

You're not exporting your EventEmitter instance in mini.js. Add this to mini.js:

module.exports = ee;

You'll also need to add a similar line in second.js if you want to export its EventEmitter instance in order to make it available to main.js.

Another problem you'll run into is that you're emitting testing in mini.js before second.js adds its testing event handler, so it will end up missing that event.