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

时间:2014-05-01 22:30:21

标签: javascript node.js

我很难理解为什么这么复杂,所以我怀疑自己做错了什么。假设我有两个看起来像这样的控制器。它们在端点方面几乎没有克隆,但在操作中却没有 - 有点像接口实现

(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'

知道为什么或如何更好地解决这个问题?

2 个答案:

答案 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;
})();