web-dev-qa-db-ja.com

socket.on( 'connection' ... nodejs + express + socket.ioでイベントが発生しない

問題 socket.ioが機能しない

詳細

  • express [folder]; cd [folder]; npm install;でプロジェクトを生成しました
  • 設定socket.io npm install socket.io
  • 以下のコードでノードアプリを実行する
  • クライアントconnectイベントは発生しますが、サーバーconnectionは発生しません。

セットアップ

  • Server AWS無料利用枠、Ubuntu 11.10、AMI-a7f539ce
  • nodejs v0.6.5
  • express v2.5.1
  • socket.io v0.8.7

クライアント

 var socket = io.connect('http://example.com:3000');

 socket.on('connect', function() { 
    console.log('connected');
 });

 socket.on('message', function(msg){
    console.log(msg);
 });

 socket.on('disconnect', function() {
    console.log('disconnected');
 });

 socket.on('error', function (e) {
    console.log('System', e ? e : 'A unknown error occurred');
 });

サーバー

 [...]

 app.listen(3000);

 // socket.io setup
 var socket = require('socket.io').listen(app);

 // socket.io connection establishment
 socket.on('connection', function (client) {
    client.send("hello");
    console.log("hello", client);           
 });

connectionイベントが発生しないのはなぜですか?

13
Gaston

しばらく時間がかかりました... connectionイベントはio.socketsでエミットされます。あなたのコードではこれは

socket.sockets.on('connection', function (client) {
  client.send("hello")
  console.log("hello", client)
})

この混乱を避けるには、変数名としてioではなくsocketを使用する必要があります。

13
Ricardo Tomasi

Ricardo Tomasi 正しいです。私の命を救いました。夢中になりました。

物事は変わりましたが、2013年です これについてはまだ問題が(2年以来)開かれています

おそらく何かが変わった、とにかく 'connect'イベントを登録するために私はこれをしなければならなかった:

var openSocket = function (uniqueID) {
  var appSocket = io.connect('/'+uniqueID, { transports: ['websocket', 'xhr-polling']});
  appSocket.socket.on('connect', function () {
    console.log('i did connect.');
  });
  return appSocket;
};
1
Valerio

次は私のためにトリックを行いました:socket.io-client: "^ 0.9.16"

io.connect("http://localhost:4000", {'force new connection': true});

これで、「接続」イベントが常に発生し、再利用されません。

このオプションは、socket.io-client/lib/io.jsの行を調べることでわかりました:192このio.jsファイルがgithubで見つからないため、将来のリリースではリファクタリングが行われていると考えられます。作業。

少なくとも、これはこの一時的な作業を回避する誰かにとって役立つかもしれません。

1
gogaman