2016-03-28 11 views
1

Ich habe 3 verschiedene Javascript-Dateien, die kleinste gibt ein Ereignis aus, während die zweite (größere) Datei das Ereignis aufnimmt und es weiter an die Hauptdatei sendet. Dies ist, was habe ich bisher versucht:Knoten Ereignis Emitter in anderen Modulen

//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); 
}); 

Allerdings bekomme ich

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

Fehler, wenn die Datei mit dem Knoten ausgeführt wird.

Was mache ich hier falsch? Danke

Antwort

2

sollte Dieses arbeiten:

Dies ist der Inhalt innerhalb first.js setzen:

//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; 

Dies ist der Inhalt zu setzen innen 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'); 

Jetztnode second.js ausführen und Sie sollten das Ereignis "Nachricht" für Sie ausgelöst haben.

Sie können dieses Muster verwenden, um eine beliebige Nachrichtenebene zwischen Modulen zu erreichen.

Hoffe, das hilft.

+0

@NedasMikoleika benenne in diesem Fall ** second.js ** in ** main.js ** um und das ist es oder da fehlt mir hier etwas? – Ismail

+0

Ich habe eigentlich alles andere (den Rest meines Servers) in der Datei ** main.js **. – Nedas

+0

@NedasMikoleika kein Problem, füge einfach den Inhalt von ** second.js ** zu deiner ** main.js ** Datei hinzu. – Ismail

1

Sie exportieren Ihre EventEmitter-Instanz nicht in mini.js. Fügen Sie diese auf mini.js:

module.exports = ee; 

Sie finden auch eine ähnliche Linie in second.js hinzufügen müssen, wenn Sie seine EventEmitter Instanz, um exportieren wollen, dass es zugänglich zu machen main.js.

Ein weiteres Problem, das Sie stoßen werden, ist, dass Sie testing in mini.js ausstrahlen, bevor second.js seinen testing Event-Handler hinzufügt, damit es dieses Ereignis schließlich vermisst.

+0

Irgendwelche möglichen Korrekturen für dieses? – Nedas

Verwandte Themen