1

Express と socket.io を使用する nodeJS アプリケーションがあります。私が提供する 1 つのページでのみ実行されるように、いくつかのコードを分離したいと考えています。これを行うために、エクスプレスを使用してリクエストをリッスンし、html ページをレスポンスとしてフィードしました。

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
}

データをリッスンしてhtmlページに送信するsocket.io関数もあります。

io.sockets.on('connection', function(socket) {
     channel.subscribe('cheat', function(message) {
      socket.emit('message', message);
});\

コードがこのような場合、すべてがうまく動作しますが、 app.get 関数内に socket.on 関数を入れようとするとすぐに問題が発生します。最初のリクエストは完全に機能しますが、ページが更新されるとすべてのデータが複製されます。最初は x2、次に x3、次に x4 などです。なぜこれが起こっているのか誰にも分かりますか?

これは私の最終的なコードがどのように見えるかです:

app.get('/archive', function(request, response) {
    response.sendfile(__dirname + "/views/table.html");
    io.sockets.on('connection', function(socket) {
        channel.subscribe('cheat', function(message) {
        socket.emit('message', message);
    });
}
4

2 に答える 2

1

HTTP ルート内に Socket.IO 接続リスナーを配置しないでください。接続があるたびに Socket.IO オブジェクトのconnectionイベントが呼び出されるため、HTTP ルートが呼び出されるたびに新しい接続リスナーを作成すると、接続があるときにすべて起動する重複したリスナーができます。

特定のページで Socket.IO を使用したくない場合は、そのページにクライアント スクリプトを含めないでください。それ以外の場合、これを行う別の方法として、クライアント パスを Cookie に保存し、承認時にその Cookie にアクセスする方法があります。次に、クライアントを承認または拒否できます。

于 2013-10-31T22:08:04.690 に答える
0

url.parse 関数を使用して、次のようにページの名前を取得しました。

var curURL = url.parse(request.url).pathname;

次に、現在のURLを確認できます

 if (curURL == '/') {
    //code
}

値が重複している問題については、終了時に登録を解除するのを忘れていました。subscription.unsubscribe(); の後 それはすべて動作します。

于 2013-11-04T18:00:11.810 に答える