2016-10-07 3 views
1

node.js,expresssocket.ioを使用してwebsocketアプリの基礎を設定しています。 socket.ioを設定するコードを別のモジュールに配置するのがエレガントであると判断したので、私のserver.jsファイルは、socket.ioセットアップの任務のためにrequireを呼び出して小さくすることができます。私ws-controller.jsファイルで可変スコープ(module.exports + socket.io setup)

// server.js 

// set up ====================================================================== 
var express = require('express'); 
var app  = express(); 
var server = require('http').Server(app); 
var io  = require('socket.io')(server); 
var port = process.env.PORT || 80; 

// routes ====================================================================== 
app.get('/', function (req, res) { 
    res.sendFile(__dirname + '/index.html'); 
}); 

// socket.io controller ======================================================== 
require('./app/ws-controller.js')(io); 

// launch ====================================================================== 
server.listen(port, function() { 
    console.log('Server listening on port ' + port + '!'); 
}); 

私はsocket.ioを使用してみるにはいくつかのコードを配置。

// app/ws-controller.js 
module.exports = function(io) { 
    var numClients = 0; 
    io.on('connection', function (socket) { 
     numClients++; 
     console.log(numClients); 
    }); 
} 

index.htmlに埋め込まれたクライアントスクリプトは最小限です。

// client side script 
var port = 80; 
var socket = io.connect('http://127.0.0.1:' + port); 

ここまでです。 localhostを指す新しいブラウザタブを開くと、サーバはコンソールにログ番号numClientsのログを記録します。それは実際にどのように機能していますか? numClientsが範囲外になり、コンソールで例外が発生すると予想されていました。 on connectionイベントにバインドされたコールバック関数は、ioオブジェクトに対してグローバルでもプライベートでもないため、numClientsという変数が表示されません。ここで実際に何が起こっていますか?

答えて

1

javascriptでクロージャの詳細を読む必要があります。この特定の例では、アプリケーションを起動するとnumClients = 0;が初期化され、匿名の実行コンテキストでメモリに残りますfunction(io)。次に、新しい接続があるたびに、io.on('connection')イベントがトリガされ、コールバックが実行されます。numClientsはまだ実行コンテキスト内にあります。そのため、この変数が増分されるのがわかります。

+0

'io.on( 'connection')'イベントがトリガされると、コールバックはまだ 'function(io)'のコンテキストで実行されますか?私はセットアップ機能が作成され、実行され、忘れてしまったので、それは新鮮なものと思った(少なくとも私が推論したものだ)。 – Apo

+1

@Apoこれはノードモジュールの場合ではありません。モジュールが必要な場合、ノードはモジュールをキャッシュし、別のファイルにモジュールが必要な場合は同じインスタンスを返すようにします。これは参考になります:http://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate –

+0

クローズについては、疑問を解決するのに役立ちます。 JavaScriptを非常に強力かつ表現力豊かにする機能の1つです。 – Nivesh