2016-03-28 4 views
1

У меня есть 3 разных файла javascript, самый маленький из которых испускает событие, между тем второй (более крупный) файл подбирает событие и отправляет его дальше в основной файл. Это то, что я пытался до сих пор:Идентификатор события узла в других модулях

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

Однако я получаю

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

ошибку при выполнении файла с узлом.

Что я здесь делаю неправильно? Thanks

ответ

2

Это один должен работать:

Это содержание положить внутрь 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; 

Это содержание положить внутрь 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'); 

Теперь запуститьnode second.js и у вас должно быть событие «сообщение», выпущенное для вас.

Вы можете использовать этот шаблон для достижения любого уровня обмена сообщениями между модулями.

Надеюсь, это поможет.

+0

@NedasMikoleika в этом случае переименовывает ** second.js ** на ** main.js ** и это он или есть что-то, что я здесь отсутствует? – Ismail

+0

На самом деле у меня есть все остальное (остальная часть моего сервера) в файле ** main.js **. – Nedas

+0

@NedasMikoleika не проблема, просто добавьте содержимое ** second.js ** в ваш файл ** main.js **. – Ismail

1

Вы не экспортируете свой EventEmitter экземпляр в mini.js. Добавьте к этому mini.js:

module.exports = ee; 

Вам также нужно добавить аналогичную строку в second.js, если вы хотите экспортировать EventEmitter экземпляр для того, чтобы сделать его доступным для main.js.

Еще одна проблема, с которой вы столкнулись, заключается в том, что вы высылаете testing в mini.js до того, как second.js добавит свой обработчик события testing, так что это закончится тем, что не будет отсутствовать это событие.

+0

Любые возможные исправления для этого? – Nedas