架构查询..使用Node.js构build服务/消息总线

所以情况是,我有各种各样的数据源,从外部设备提供的消息stream..一些正在发送消息串口,一些通过UDP,一些通过Telnet ..我希望build立一个小的Node.js系统接收来自每个来源的消息。 大约有20个来源。

我有各种各样的地方,然后我要传递这些消息,我希望允许客户端通过telnet连接并接收这些消息。

我想你可以称之为“服务巴士”或“信息巴士”。

目前我只是围绕如何构build它的想法踢,我不想要一个巨大的node.js文件,它做的一切。

我希望每个“接收器”都在外部.js文件中,以我的主要node.js文件..是我的方法低于确定,有什么改进,我可以做我的方法。

主要Node.js文件

拉入两个“接收器”..每个这些将处理来自数据源的传入消息

var sys = require("sys"); AVLReceiver = require("./avlreceiver.js").AVLReceiver(); PagerReceiver = require("./pagerreceiver.js").PagerReceiver(); 

pagerreceiver.js – 一个示例消息接收器

从串口接收消息

 var serialport = require("serialport"); var sys = require("sys"); var PagerReceiver = {}; PagerReceiver.initializePort = function () { this.serialport = new serialport.SerialPort("/dev/ttyS0", { parser: serialport.parsers.readline("\n"), baudrate: 57600 }); this.serialport.on("data", this.processMessage); }; PagerReceiver.processMessage = function (data) { //deal with the message }; PagerReceiver.initializePort(); exports.PagerReceiver = function() { return PagerReceiver; }; 

这将是一个合适的方式来打破node.js系统? 任何关于JavaScript的意见也感激地收到..任何其他build筑方法,我应该考虑在node.jsbuild立一个消息总线的意见将是超级。

谢谢阅读,

邓肯。

这是一个较老的问题,所以你可能已经build立了你的解决scheme,但我会加上我的意见,以防万一它有用。

将接收器专用的代码保持隔离的想法对我来说绝对是正确的,它将使读者清楚哪些代码与主工作stream相关,哪些代码与特定stream相关。

我也很想尝试;

  • 如果可能的话,让所有的接收器使用相同的接口,这样主代码就简单了。
  • 也许使用EventEmitter来触发可以被更高级别的应用程序代码捕获的事件
  • 将诸如串行端口和波特率等configuration外部化为每个应用程序或每个环境的configuration文件。 节点的模块系统自动检查“〜/ node_modules”,这样你可以把每个环境的configuration放在那里,以避免在部署新代码时被覆盖。
  • 我很想看看你的模块导出其function的方式,见下文。

实例化

我发现你处理对象创build的方式有点误导,因为它使exports.PagerReceiver()看起来像一个类构造函数,它不是; 在这种情况下它返回一个单例对象。 模块本身已经是一个单例实例,所以这有点多余,可能会引起误解。

下面是多个调用require()实际引用相同的私有variablesi的例子。

counter.js

 var i = 0; exports.iterate = function(){ return i++; }; 

test.js

 var counter1 = require('./counter'); var counter2 = require('./counter'); console.log(counter1.iterate()); console.log(counter2.iterate()); console.log(counter1.iterate()); console.log(counter2.iterate()); 

输出:

 0 1 2 3 

下面的代码更简单,function相同,除了用require()而不是require()来调用PagerReceiver():

 var serialport = require("serialport"); var sys = require("sys"); exports.processMessage = function (data) { //deal with the message }; var port = new serialport.SerialPort("/dev/ttyS0", { parser: serialport.parsers.readline("\n"), baudrate: 57600 }); port.on("data", exports.processMessage);