1

私は現在、自分のプロジェクトの 1 つに Socket.io を使用していますが、私の更新の 1 つに問題があります。

新しいデータを受信したとき、コンソールにログを作成しています (console.log(data)) が、ログが 1 つではなく、同じ内容のログが 7 ~ 9 個あるのが問題です。

io.sockets.on( 'connection', function ( socket ) {
  fs.watch( 'example.xml', function ( curr, prev ) {
    fs.readFile( 'example.xml', function ( err, data ) {
      if ( err ) throw err;
      parser.parseString( data );
    });
  });
  parser.addListener('end', function( result ) {
    result.time = new Date();
    socket.volatile.emit( 'notification' , result );
  });
});

result.time は毎回異なります(私のテストのためだけに)

誰かが同じ「問題」を抱えていますか?どうすれば解決できますか?

4

1 に答える 1

0

問題は、ソケットが接続するたびに、新しい「終了」イベントparserオブジェクトにアタッチすることだと想像できます。

したがって、接続する最初のソケットは 1 つの「終了」イベントをアタッチします。接続する次のソケットは別のソケットを接続します。これは listeners の配列であるため、スタックに追加されるため、最終的に N 個の「終了」イベントが発生します...

解析が終了すると、「終了」イベントが発行されます。また、2 つ、3 つ、またはそれ以上の「終了」イベントを追加すると、N 回発生します。したがって、ロジックに問題があります。重複を処理しない限り、既に初期化されているオブジェクト (およびおそらくシングルトン オブジェクト) に接続時にイベントをアタッチすることはできません。

「終了」イベントを io.sockets.on('connection') イベントの外側にアタッチし、ここでソケットへの参照を渡すことをお勧めします。これにより、通知の送信者がわかります。

parser.parseString( data, **socket** );

お役に立てば幸いです。

于 2012-08-13T11:32:51.717 に答える