node.js如何在模块之间进行通信

时间:2016-06-10 08:27:00

标签: javascript node.js

我是node.js的新手,最近开始制作一些模块。但是,我已经到了需要模块之间通信的程度。因为这不是我过去遇到过的问题,所以我很难找到一个干净的解决方案。

这是我目前得到的样板(省略了一些检查以使代码更小)。基本的想法是加入由http发布的任何irc频道。

bot.js

//Include services

var Webservice    = require('./Webservice');
var Ircservice    = require('./Ircservice');

//Create service instances

var webservice = new Webservice();
var ircservice = new Ircservice();

//Initialize services

webservice.init(1337);
ircservice.init('alt-irc.snoonet.org', 80, 'User');

//Handle events

ircservice.on('irc-registered', function(msg){
    console.log(ircservice.connected);

    ircservice.joinChannel('#testchannel')
});

ircservice.on('irc-join', function(channel){
    console.log('Successfuly joined: ' + channel);
});

webservice.on('web-join', function(streamer){
    ircservice.joinChannel('#' + streamer);
});

Webservice.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var util = require('util');
var EventEmitter = require('events').EventEmitter;

app.use(bodyParser.urlencoded({
  extended: true
}));

var Webservice = function(){
    EventEmitter.call(this);
};

Webservice.prototype.init = function(port){
    app.listen(port, function () {
      console.log('Webserver listening on ' + port);
    });

    this.initRoutes();
};

Webservice.prototype.initRoutes = function(){
    var self = this;

    //join a irc-channel
    app.post('/join', function (req, res) {
        var streamer = req.body.name;

        self.emit('web-join', streamer);
        res.send('Received')
    });

};

util.inherits(Webservice, EventEmitter);

module.exports = Webservice;

Ircservice.js

var irc = require('irc');
var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Ircservice = function(){        
    EventEmitter.call(this);
}

Ircservice.prototype.init = function(server, port, nick){       
    this.client = new irc.Client(server, nick, {
        port: parseInt(port)
    });

    this.initListerners();
};

Ircservice.prototype.initListerners = function(){
    var self = this;

    this.client.addListener('message', function (from, to, message) {
        console.log(from + ' => ' + to + ': ' + message);
    });

    this.client.addListener('join', function(channel, nick, message){
        self.emit('irc-join', channel);
    });
};

Ircservice.prototype.joinChannel = function(channel){       
    this.client.join(channel, null);
};

util.inherits(Ircservice, EventEmitter);

module.exports = Ircservice;

此示例完美无缺,但正如您所见,我的webservice和ircservice之间的通信由bot.js处理。虽然这个例子非常好,但我不能随时使用这种方法。

我希望将来能够在我加入的所有频道的ircservice中保留一个列表并通过网页显示。我可以在我的ircservice上保留一个本地数组,并在join事件中将该通道添加到数组中。但是,我如何继续在Web服务端。我可以写一个端点'/ getchannels'但我的webservice本身并不知道ircserver获取通道(ircservice.getChannels或类似的东西)并在我的web请求中触发事件感觉不太好。< / p>

我想到的一个解决方案是将服务实例传递给对方,如webservice.setIrcservice(ircservice),另一种方式传递给bot.js.但这感觉就像是脏代码和难以依赖的代码。

那么,当我需要即时数据并且事件不可选时,如何在模块之间进行通信?

0 个答案:

没有答案