我很难理解为什么这么复杂,所以我怀疑自己做错了什么。假设我有两个看起来像这样的控制器。它们在端点方面几乎没有克隆,但在操作中却没有 - 有点像接口实现
(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'
知道为什么或如何更好地解决这个问题?
答案 0 :(得分:2)
这将按您的意愿工作。请记住,module.exports将被缓存,当您第二次运行require('ImportantEvent')
时,您将获得之前初始化的实例(单例)
var inherits = require('util').inherits,
EventEmitter = require('events').EventEmitter;
function ImportantEvent(){}
inherits(ImportantEvent, EventEmitter);
ImportantEvent.prototype.Saved = function(){}
module.exports = new ImportantEvent();
答案 1 :(得分:1)
我认为您遇到的问题是由于您设置事件发射器的方式。 on
函数是EventEmitter
原型的一部分。这意味着您需要创建它的实例,而不仅仅是调用已有对象的构造函数。如果您按如下方式重写ImportantEvent
,则应该获得on
函数,并且可能其余的内容将开始工作:
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;
})();