node.js
,express
、socket.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
という変数が表示されません。ここで実際に何が起こっていますか?
'io.on( 'connection')'イベントがトリガされると、コールバックはまだ 'function(io)'のコンテキストで実行されますか?私はセットアップ機能が作成され、実行され、忘れてしまったので、それは新鮮なものと思った(少なくとも私が推論したものだ)。 – Apo
@Apoこれはノードモジュールの場合ではありません。モジュールが必要な場合、ノードはモジュールをキャッシュし、別のファイルにモジュールが必要な場合は同じインスタンスを返すようにします。これは参考になります:http://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate –
クローズについては、疑問を解決するのに役立ちます。 JavaScriptを非常に強力かつ表現力豊かにする機能の1つです。 – Nivesh