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', @)