2

所以我正在尝试将我的项目从开发转移到生产,并由modules.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 将在服务器上连接并运行,直到我尝试发出或响应事件

另外,如果它有帮助,这是我的事件聚合器类:

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

所以当我尝试运行下面的代码时,@(相当于thiscoffeescript)是自引用的,因此创建了一个无限循环并崩溃了socket.io。

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