8

したがって、外部デバイスからのメッセージのストリームを提供するさまざまなデータソースがあるという状況です。シリアルポートでメッセージを送信するものもあれば、UDP を介して送信するものもあれば、Telnet を介して送信するものもあります。小さな Node.js を構築したいこれらの各ソースからメッセージを受信するシステム。全部で約20のソース。

これらのメッセージを中継したいさまざまな場所があり、クライアントが telnet 経由で接続してこれらのメッセージを受信できるようにしたいと考えています。

「サービスバス」とか「メッセージバス」と呼んでもいいと思います。

現時点では、それをどのように構造化するかについてのアイデアを蹴っているだけです。すべてを実行する1つの巨大なnode.jsファイルは必要ありません..

各「レシーバー」をメインのnode.jsファイルの外部.jsファイルに配置したい..以下の私のアプローチはOKですか、私のアプローチに改善できる点はありますか?

メイン Node.js ファイル

2 つの「レシーバー」を取り込みます。これらのそれぞれが、データソースからの受信メッセージを処理します。

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 に関するコメントもありがたく受け取りました。また、node.js でメッセージ バスを構築するために考慮すべき他のアーキテクチャ アプローチに関するコメントは、非常に役に立ちます。

読んでくれてありがとう、

ダンカン。

4

2 に答える 2

3

これは古い質問なので、おそらく既にソリューションを構築しているでしょうが、誰かにとって役立つ場合に備えて、私の考えを追加します.

レシーバー固有のコードを分離しておくという考えは、私には間違いなく正しいように思えます。これにより、どのコードがメイン ワークフローに関連し、どのコードが特定のストリームに関連しているかが読者に明確になります。

私も試してみたくなりました。

  • 可能であれば、すべてのレシーバーに同じインターフェイスを与えて、メイン コードをシンプルにします。
  • おそらく、EventEmitters を使用して、より高いレベルのアプリ コードでキャッチできるイベントをトリガーします。
  • シリアル ポートやボー レートなどの構成をアプリごとまたは環境ごとの構成ファイルに外部化します。ノードのモジュール システムは自動的に「~/node_modules」をチェックするため、新しいコードをデプロイするときに上書きを避けるために、そこに環境ごとの構成を配置できます。
  • モジュールがその機能をエクスポートする方法を見てみたいと思います。以下を参照してください。

インスタンス化

exports.PagerReceiver() がクラスコンストラクターのように見えるため、オブジェクトの作成に取り組んでいる方法が少し誤解を招くと思いますが、そうではありません。この場合、シングルトン オブジェクトを返します。モジュール自体はすでにシングルトン インスタンスであるため、これは少し冗長であり、誤解を招く可能性があります。

以下は、require() への複数の呼び出しが実際に同じプライベート変数iを参照する方法の例です。

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

次のコードは、require().PagerReceiver() の代わりに require() で呼び出されることを除けば、より単純で機能的に同じです。

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);
于 2011-05-22T12:41:52.990 に答える