我是node.js的新手,最近开始制作一些模块。但是,我已经到了需要模块之间通信的程度。因为这不是我过去遇到过的问题,所以我很难找到一个干净的解决方案。
这是我目前得到的样板(省略了一些检查以使代码更小)。基本的想法是加入由http发布的任何irc频道。
//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);
});
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;
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.但这感觉就像是脏代码和难以依赖的代码。
那么,当我需要即时数据并且事件不可选时,如何在模块之间进行通信?