2016-07-27 16 views
0

私はフロントエンドではreact、バックエンドではnode/expressを使用しています。私はソケットを統合して、あるクライアント上で行われたクリックイベントを他のすべてのクライアント上で生成させようとしています。 (たとえば、誰かが「再生曲」をクリックすると、他のすべてのユーザーがその曲を再生するためのクリックイベントを発生させます)。Socket.ioとNode/Express - 呼び出しスタックの最大サイズを超えました

何かをクリックすると、サーバーのソケットリスナーに到達し、ブラウザのコンソールに最大呼び出しスタックサイズを超えて表示されます。

PS:コードをインポートするのは初めてのことで、インデントしません。

サーバーサイドコード:

var express = require('express'); 
var http = require('http'); 
var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io')(server); 
server.listen(8000); 
io.on('connection', function (socket) { 
    console.log('socket connected!'); 
    socket.on('myClick', function (data) { 
     console.log('event hit Server'); 
     socket.broadcast.emit('myClick', data); 
    }); 
    socket.on('disconnect', function() { 
     io.emit('user disconnected'); 
    }); 
}); 

クライアント側コード:

$(document).ready(function() { 
    var socket = io('http://localhost:8000'); 

    $(document).on('click', function(event){ 
     console.log('Something has been clicked!'); 
     console.dir(event.target); 
     socket.emit('myClick', {id: event.target}); 
    }); 
    socket.on('myClick', function (data) { 
     console.log('event hit other client'); 
     $(data.id).trigger('click'); 
    }); 
}); 
+0

使用スペースへ:IDまたはイベントを発生しなければならない要素のクラスのように、より具体的なものと

$(document).on('click', function(event){ 

ラインを置き換えますインデント。 – Will

+0

'console.dir'コールがないと同じエラーが発生しましたか? – Will

答えて

1

あなたのエラーは、クライアント側で、あなたが呼び出しの無限ループを引き起こしているされています

  1. DOMをクリックすると、「クリック」機能が起動します。
  2. この関数はソケットの "myClick"イベントを送出するので、 "myClick"関数が起動されます。
  3. この関数の内部では、クリックイベントがトリガされるため、前の関数が再び発生し、無限に手順1に戻ります。

ソリューション

$("#elementId").on('click', function(event){ 
+0

それでもクライアントはクリックを再開しますが、クリックされた特定の要素に対してのみ発動します。クライアントは、送信されたクリックと他のクライアントが発したクリックを区別する必要があります。ソケット上のソケットは、別のクライアントからのクリックだけを複製します。しかし、再帰の問題にスポットを当てる。 – ste2425

関連する問題