3

サーバーで2つのExpress.jsアプリを実行しています。

「main-app」と呼ばれるプレーンなバニラアプリと、「socket-app」と呼ばれるSocket.IOを使用する別のアプリ。

「mydomain.com」で「main-app」を実行し、「socket.mydomain.com」のサブドメインで「socket-app」を実行しています

Expressの組み込みのvhostミドルウェアを介してsocket-appにリクエストをルーティングしています。

--main-app.js内-

var express = require('express');
var app = module.exports = express.createServer();
app.use(express.vhost('socket.mydomain', require('./socket-app/app.js')));

app.listen(8080, function(){
  console.log("Express server listening on port %d in %s mode");
});

これは正常に機能し、socket.mydomainのポート8080でsocket-appが実行されているのを確認できます。

ただし、ここで説明するように、vhostを介してSocket.IOアプリを実行すると、WebSocketがタイムアウトし、「アップグレード」イベントを受信しないという問題があるようです。

だから私の質問は、この「アップグレード」イベントをメインアプリからソケットアプリにパイプして、接続されているすべてのソケットが誰かが接続および切断したときに聞こえるようにするにはどうすればよいですか?

「main-app」内から「upgrade」イベントを発行しようとしましたが、機能していないようです。

app.on('upgrade', function(req, socket) {
    socket.emit('upgrade', app);    
});

ここで何が欠けていますか?

4

1 に答える 1

6

解決策は、ルートアプリケーションにSocket.IOのインスタンスを1つ作成し、サブドメインアプリケーションからグローバルにアクセスできるようにしてから、各アプリを独自のSocket.IO名前空間で実行して自律性を維持することです。

ルートアプリケーションで宣言されているSocket.IOの同じインスタンスをすべて共有するチャットアプリケーションの3つのインスタンスを実行する簡単な例を作成しました。

プロジェクトのクローンを作成し、指示に従ってローカルサブドメインを設定すると、チャットアプリケーションの各インスタンスが他のインスタンスから独立して実行されていることがわかります。

明日の朝、それがどのように機能するかについての詳細をブログに投稿しようと思います。

アップデート

これは、複数のドメイン間でSocket.IOインスタンスを共有する方法の記述です。

于 2012-06-15T01:41:10.730 に答える