node.jsでファイルサーバとsocket.ioのロジックを分離する
質問
私は node.js のかなり新しいユーザーですが、プロジェクトのサイズが大きくなると、プロジェクトを複数のファイルに分離することが非常に複雑になることがわかりました。私は以前、ファイル サーバーとマルチプレイヤー HTML5 ゲーム用の Socket.IO サーバーの両方として機能する 1 つの大きなファイルを持っていました。理想的には、ファイル サーバー、Socket.IO ロジック (ネットワークから情報を読み取り、タイムスタンプ付きのバッファに書き込み、他のすべてのプレイヤーに送信する)、およびゲーム ロジックを分離したいのです。
私の問題を示すためにsocket.ioの最初の例を使用すると、通常2つのファイルがあります。
app.js
がサーバで
index.html
がクライアントに送られます。
app.js:
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen(80);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
index.htmlを表示します。
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
ファイル サーバーとゲーム サーバーのロジックを分離するために、1 つのファイルで定義された関数 "handler"が必要で、別のファイルで io.sockets.on() のコールバックとして使用する匿名関数が必要で、さらにこれらのファイルの両方を正常に含めるために 3 つ目のファイルが必要です。今のところ、私は以下を試してみました。
start.js。
var fileserver = require('./fileserver.js').start()
, gameserver = require('./gameserver.js').start(fileserver);
fileserver.jsを使用します。
var app = require('http').createServer(handler),
fs = require('fs');
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
module.exports = {
start: function() {
app.listen(80);
return app;
}
}
ゲームサーバです。
var io = require('socket.io');
function handler(socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
}
module.exports = {
start: function(fileserver) {
io.listen(fileserver).on('connection', handler);
}
}
これは動作しているように見えますが (静的コンテンツは適切に提供され、クライアントが接続したときにコンソールは Socket.IO とのハンドシェイクを明確に表示します)、データは送信されません。まるで socket.emit() と socket.on() が実際に呼び出されないかのようです。私は
gameserver.js
を追加するために
console.log('User connected');
を追加したが、これは表示されない。
あるファイルに Socket.IO があり、別のファイルにファイル サーバーがあり、それでも両方が正しく動作することを期待するにはどうしたらよいでしょうか。
どのように解決するのですか?
socket.io 0.8では、イベントのアタッチに
io.sockets.on('...')
を使用する必要がありますが、名前空間を使用していない限り、この
sockets
の部分が欠けているようです。
io.listen(fileserver).sockets.on('connection', handler)
そのように連鎖させるのは避けた方がよいでしょう(そのために
io
オブジェクトを後で使うことになるかもしれません)。私が今やっている方法は
// sockets.js
var socketio = require('socket.io')
module.exports.listen = function(app){
io = socketio.listen(app)
users = io.of('/users')
users.on('connection', function(socket){
socket.on ...
})
return io
}
次に、サーバを作成した後
app
:
// main.js
var io = require('./lib/sockets').listen(app)
関連
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み] エラー: nodejs の get 呼び出しで getaddrinfo ENOTFOUND が発生しました。
-
[解決済み】AWS Lambdaでnodejsの「ref」モジュールを使用すると「invalid ELF header」と表示される件
-
[解決済み】Mongooseで、日付でソートするにはどうしたらいいですか?(node.js)
-
[解決済み] npm install エラー - ローカルの発行者証明書を取得できません。
-
[解決済み] npm package.jsonファイルのdependencies, devDependencies, peerDependenciesの違いは何ですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsでファイル/ディレクトリが存在するかどうかを同期的にチェックする
-
[解決済み] Node.js クイックファイルサーバ (静的ファイルオーバーHTTP)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「安全なTLS接続が確立される前にクライアントのネットワークソケットが切断されました」(ノード10
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み] bodyParser は非推奨です express 4
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] エラーメッセージ MongoError: bad auth URI 文字列で認証に失敗しました。
-
[解決済み] バルク更新を行う。