Socket.io在每个发射失败

所以我正试图将我的项目从开发转移到生产,使用modulus.io进行托pipe。

问题是,每当我尝试在服务器< – >客户端连接之间发送或接收数据时,应用程序在服务器端失败。

这是我得到的错误:

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

这是我在debugging的地方:

  • 这是错误的地方,虽然有时候在其他地方,这取决于谁试图首先发出一个事件:

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

经过大量的debugging,我发现当JSON.stringify()试图将一个循环对象(即一个自引用对象JSON.stringify() stringify ,函数将因recursion而无限运行。

Chrome发送请求错误:TypeError:将循环结构转换为JSON

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

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