0

モジュールにsocket.ioインスタンスをカプセル化しようとしています。私はこれを行いましたが、エクスプレス/パスポートからのソケットトランスポートの認証のためにいくつかの依存関係を注入する必要があるため、少し厄介に見えます。

私の問題は、次のようなモジュールの外部のソケットインスタンスにアクセスしたいことです。socket.on("newDevice", function (data) {});

接続イベントによって取得したソケットインスタンスは関数内にあり、接続が確立されていないため、作成時に存在しない場合もあります。これは私にはちょっと間違っているように見えます。関数スコープ内に依存関係が必要であるという理由だけで、依存関係をどんどん注入したくありません。

sio.on('connection', function(socket) {});モジュールの外でやろうと思いました。そして多分私はそれを2回行うことができます、最初はモジュールの内側、次に外側ですが、私は推測する2つのリスナーを作成します。

これを適切に行うための良い習慣やパターンはありますか?

var io = require('socket.io');

var socket = function (server, sessionStore, cookieParser, authentication)  {

    var sio = io.listen(server);

    // Configure socket.io
    sio.configure(function () {

        // Authorize the socket.io request
        sio.set('authorization', function (data, accept) {
                    // Authorization is done here
        });

    });

    sio.on('connection', function(socket) {

    var lastActionTime = new Date();

    // Get the userId from the session
    var session   = socket.handshake.session;
    var userId    = session.passport.user;
    var sessionID = socket.handshake.sessionID;

    var userdata = null;

    // Deserialize user by the userId
    authentication.deserializeUser(userId, function(err, user) {
              // get the userdata
    });


    socket.on('disconnect', function() {

    });

    socket.on('brightnessChange', function(data) {
        // TODO Do something here device control

        // Broadcast to other devices
        this.broadcast.emit('brightnessChange', data);
    });

}); 


    return sio;
};

module.exports = socket;
4

1 に答える 1

-1

以下に、柔軟性と拡張性を提案します。私は両方の方法を試しましたが、複数の接続イベントを使用することになりました。

sio.on('connection'、function(socket){});を実行することを考えました。モジュールの外側。そして多分私はそれを2回行うことができます、最初はモジュールの内側、次に外側ですが、私は推測する2つのリスナーを作成します。

于 2012-11-23T02:40:12.617 に答える