Socket.io在每个Emit上失败

时间:2013-07-02 01:22:46

标签: javascript node.js coffeescript socket.io

所以我试图将我的项目从开发转移到生产,并以模数.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 dev工具):

    • 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)
        )
    )

1 个答案:

答案 0 :(得分:0)

经过多次拉毛调试后,我发现当JSON.stringify()尝试stringify循环对象(即自引用对象)时,该函数将因递归而无限运行。

Chrome sendrequest error: TypeError: Converting circular structure to JSON

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

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