4

私はNode.jsとExpressの初心者です:(他のモジュールのsocket.ioオブジェクトへのアクセスに問題があります。ソケットオブジェクトを保持するグローバル変数を作成しましたが、そのユーザーが接続を閉じるとすぐに接続はもう利用できません。技術的には接続はまだ残っていると思いますが、リソース上の理由で削除します。

以下では、接続が確立されるたびに、他のすべてのモジュールからアクセスできるグローバル変数にそのソケットを割り当てていることに注意してください。

// App.js
var io = require('socket.io').listen(server); 
var sessionsConnections = {};

io.sockets.on('connection', function (socket) 
{
     global.socket = socket;
     sessionsConnections[socket.id] = socket;
     .....
}

socket.on("disconnect", function() 
{
    delete sessionsConnections[socket.id];
});

// Match.js
     global.socket.emit('lobby:createMatch', data);

グローバルクローズに最後に割り当てられた接続の場合、Match.jsはねじ込まれます。この時点で、Match.jsはそのsocket.io参照を必要とする唯一のモジュールです。Match.jsには、イベントの処理、変更の発行、ビューのレンダリングのための多数のエクスポートがあります。

これをどのように処理するかについての提案はありますか?グローバル参照になる目的で、App.jsに存在する最初のソケット接続をインスタンス化することは可能ですか?

4

2 に答える 2

4

socket変数は、io.sockets.on('connection', function(socket) {...})接続ごとに異なります。

コードglobal.socketでは常に最後に接続されたクライアントを基準にしたソケットへの参照であるため、このクライアントが切断されると、このソケットは停止するのが普通です。

いずれにせよ、グローバル変数を使用する理由はわかりません。特定のクライアントにメッセージを送信する必要がある場合はsocket、接続コールバック内で変数を使用できます。

io.sockets.on('connection', function (socket) 
{
  socket.emit('foo', 'bar');
}

別のモジュールのソケットにアクセスする必要がある場合は、オブジェクトをエクスポートし、sessionsConnectionsそのIDで必要なソケットにアクセスできます。

//In app.js
exports.connections = sessionsConnections;

//In match.js
var app = require('./app.js');
app.connections[clientId].emit('foo', 'bar');

もちろん、IDのどこかを追跡する必要があります。

于 2012-12-07T09:35:39.663 に答える
0

Express.ioを試すことができます。

http://express-io.org/

npm install express.io

これは、socket.io 統合が組み込まれていることを除いて、express と同じように機能します。また、基本的なルーティングも備えているため、問題への対処が少し簡単になります。

次の簡単な例をご覧ください。

app = require('express.io')()
app.http().io()

app.io.route('some-event', function(req) {
    req.io.broadcast('announce', 'someone triggered some-event')
})

app.listen(7076)

オブジェクトでルーティングを行うこともできます。これにより、従来のコントローラーのようになります。

app = require('express.io')()
app.http().io()

app.io.route('posts', {
    create: function(req) {
        // create a post
    },
    remove: function(req) {
        // remove a post
    }
})

app.listen(7076)

それが役立つことを願っています!

于 2013-01-03T18:24:35.103 に答える