2

websocket をベースにした Node.js/Express でアプリケーションを作成しています。私は Node の EventEmitter を socket.io と組み合わせて使用​​して、ほぼ完全にイベント駆動型のアプリを作成しています。

これは良いアーキテクチャなのだろうか。現在、私のメイン ソケットは app.js で管理されており、次のようなコードがあります。

socket.on(Events.InitialFetch, function(battle_id){
    dispatcher.emit(Events.InitialFetch, battle_id);
  });

dispatcher.on(Events.InitialFetched, function(data){
    socket.emit(Events.InitialFetched, data);
  });

...コントローラー内では、次のようなコードがあります。

dispatcher.on('initial-fetch', function(data){
    Battle.findOne({_id: data})
        .populate('players')
        .populate('owner')
        .exec(function(err, battle){
        if (err) {

        }
        else {
            dispatcher.emit(Events.InitialFetched, battle);
        }
    });
});

通常の RESTful ルーティングの代わりに。私の懸念は、少し紛らわしい (つまり、データ フローを説明するための 'fetch' と 'fetched') ことと、基本的に 1 つのタイプのイベント エミッター (socket.io) から別のタイプ (Event.EventEmitter) にメソッドを渡しているという事実です。 .

どうすればこれをより適切に設計できますか? EventEmitter をバスとして使用するのではなく、コントローラがソケットに直接アクセスできるようにしたほうがよいでしょうか? イベントの名前をより明確にするにはどうすればよいですか?

4

1 に答える 1

2

複数のイベントエミッターを使用する必要はありません。これらは、Node.jsで構築するのに適したプリミティブです。デザインに関しては、コンポーネントをどれだけ深く結合しているかという質問があります。

コントローラに非socket.ioイベントエミッタを使用することにより、Socket.ioはコントローラからの独立したトランスポートになります。これはいい。

最終段階として、依存性注入を使用して2つを相互に接続する必要があります。ファイルでディスパッチャーをserver.js作成し、socket.ioモジュールを初期化してディスパッチャーを依存関係として渡します。

var dispatcher       = require('./dispatcher')
var socket_transport = require('./socket_transport')

socket_transport.init_with_dispatcher(dispatcher);

これにより、トランスポートとは関係なくディスパッチャをテストできます。socket.ioのデバッグは難しい場合があります。

于 2013-01-28T17:55:32.170 に答える