多个控制器上的Node.js eventemitter订阅

我很难理解为什么这么复杂,所以我怀疑我做错了什么。 假设我有两个看起来像这样的控制器。 它们几乎是关于端点的克隆,但不是在运行 – 就像接口实现一样

(function(someController){ //some require statements var importantEvent = require("../Connectors/SaveEvents"); someController.init = function(app){ //app.get, app.post, etc etc etc app.post('/saveThat', function(req, res){ //do some stuff importantEvent.Saved({ from: "someController", data: stuff }); }); } importantEvent.on('Saved', function(data){ //let this guy know it happened then do some stuff }) })(module.exports); 

好? 好。 我的事件发射器的东西,不工作,我怀疑是非常错误的,看起来像这样…(SaveEvents.js)

 (function(ImportantEvent){ var util = require('util'); var eventEmitter = require('events').EventEmitter; eventEmitter.call(ImportantEvent); //??? is this needed? ImportantEvent.Saved = function(origin, dataPayload) { //maybe do some stuff to the data var self = this; self.emit('Saved', { from: origin, data: dataPayload }); }; util.inherits(OAuthEvents, eventEmitter); })(module.exports); 

当我使用咕噜声时,我得到一个不走的路

 c:\projects\srsly\node\someController.js:21 importantEvent.on('Saved', function(data){ ^ TypeError: Object #<Object> has no method 'on' 

有一个想法为什么或如何更好地去做这个?

我认为你遇到的问题是由于你如何设置你的事件发射器。 on函数是EventEmitter原型的一部分。这意味着您需要创build它的一个实例,而不是仅仅调用已经拥有的对象上的构造函数。 如果你重写你的ImportantEvent如下,你应该得到的function,其余的东西可能会开始工作:

 module.exports = (function(eve){ var EventEmitter = require('events').EventEmitter; var ImportantEvent = new EventEmitter(); ImportantEvent.Saved = function(origin, dataPayload) { this.emit('Saved', {from: origin, data:dataPayload}); }; return ImportantEvent; })(); 

这将工作,你想要的。 请记住,module.exports将被caching,并且当您第二次运行require('ImportantEvent')时,您将获得以前初始化的实例(singleton)

 var inherits = require('util').inherits, EventEmitter = require('events').EventEmitter; function ImportantEvent(){} inherits(ImportantEvent, EventEmitter); ImportantEvent.prototype.Saved = function(){} module.exports = new ImportantEvent();