2

だから私は自分のプロジェクトを開発から本番に移行しようとしています。これはmodulus.ioでホストされています。

問題は、サーバー <-> クライアント接続間でデータを送信または受信しようとするたびに、アプリケーションがサーバー側で失敗することです。

これは私が得るエラーです:

/mnt/data/2/node_modules/socket.io/lib/parser.js:75
      data = JSON.stringify(ev);
                  ^
TypeError: Converting circular structure to JSON
    at Object.stringify (native)
    at Object.exports.encodePacket (/mnt/data/2/node_modules/socket.io/lib/parser.js:75:19)
    at Socket.packet (/mnt/data/2/node_modules/socket.io/lib/socket.js:212:21)
    at Socket.emit (/mnt/data/2/node_modules/socket.io/lib/socket.js:368:15)
    at null.<anonymous> (/mnt/data/2/server/*******/*******.coffee:36:52)
    at wrapper [as _onTimeout] (timers.js:252:14)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

これが私がデバッグしているところです:

  • これはエラーのある行ですが、誰が最初にイベントを発行しようとしたかによって、別の場所にある場合もあります。

    Vent.socket?.emit('event', @)

  • Socket.io は期待どおりに動作しますlocalhost

  • Socket.io は失敗する前にクライアントに正常に接続します (chrome 開発ツールから):

    • XHR finished loading: "http://********.onmodulus.net/socket.io/1/?t=1372727710817". socket.io.js:1659

    • XHR finished loading: "http://********.onmodulus.net/socket.io/1/xhr-polling/sKNz7RX5j2fo-Rku8bDb?t=1372727711281".

  • Socket.io はサーバーに接続し、イベントを発行または応答しようとするまで実行されます

また、それが役立つ場合は、私の Event Aggregator クラスがあります:

module.exports = class Events extends events.EventEmitter

  constructor: (io) ->
    self = @
    @io = io
    @socket = null

    @io.configure(
        () =>
            console.log 'configuring socket.io...'.yellow
            @io.set("transports", ["xhr-polling"])
            @io.set("polling duration", 10)
    )

    @io.sockets.on('connection', 
      (socket) =>
        @socket = socket
        console.log 'socket connected'

        socket.on('client', (event, arg) ->
            if arg?
                self.emit(event, arg)
            else 
                self.emit(event)
        )
    )
4

1 に答える 1

1

多くの髪の毛を引っ張るデバッグの後、循環オブジェクト、つまり自己参照オブジェクトをJSON.stringify()試行すると、再帰のために関数が無限に実行されることがわかりました。stringify

Chrome sendrequest エラー: TypeError: 循環構造を JSON に変換しています

そのため、以下のコードを実行しようとすると@(coffeescript に相当this) 自己参照していたため、無限ループが発生し、socket.io がクラッシュしました。

Vent.socket?.emit('event', @)
于 2013-07-04T19:06:03.403 に答える