Javascript Node.js+;超过Socket.io最大调用堆栈大小

Javascript Node.js+;超过Socket.io最大调用堆栈大小,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,对于我的节点应用程序,我有一个运行在Debian上的服务器(app.js),使用socket.io向我的客户机(index.html)提供html和websocket数据。我正在尝试制作一个基于回合的HTML5多人游戏 在使用socket.emit()/io.emit()和socket.on()成功执行了多次数据传输之后,我的服务器在socket.emit()调用中崩溃,并出现错误 “events.js:72 抛出器;//未处理的“错误”事件 RangeError:超出了最大调用堆栈大小”。 我

对于我的节点应用程序,我有一个运行在Debian上的服务器(app.js),使用socket.io向我的客户机(index.html)提供html和websocket数据。我正在尝试制作一个基于回合的HTML5多人游戏

在使用socket.emit()/io.emit()和socket.on()成功执行了多次数据传输之后,我的服务器在socket.emit()调用中崩溃,并出现错误
“events.js:72
抛出器;//未处理的“错误”事件
RangeError:超出了最大调用堆栈大小”。
我有很多socket.on()事件监听器,每个监听器在游戏中处理不同的函数(例如掷骰子、结束回合、准备开始游戏等)

我试图研究这个问题(发现了很多关于异步循环的讨论),但无法找到如何将解决方案应用到我自己的代码中。我在此附上相关资料。您还可以通过以下网址查看my github上的所有源代码:

index.html
var socket=io.connect('http://131.178.15.173“,{'forceNew':true});
...
//----------------初始化和菜单功能-----------
socket.on('load',函数(数据){
控制台日志(数据);
clientID=数据;
emit('check_game_start',{un:clientID});
socket.on('last_client_loaded',函数(hasStarted){
log(“游戏开始了吗?:”+hasStarted);
if(hasStarted==true){
$(“#选择字符”).show();
}
});
});
socket.on('client_disconnect',函数(数据){
控制台日志(数据);
});
socket.on('client_counter',函数(数据){
如果(数据发现我的问题


我试图通过网络发送的对象(temp)(在socket.emit('roll_result',temp);)是一个自引用数组。正是数组的递归属性导致堆栈超过了最大大小。

答案非常有用。谢谢

我只是有同样的问题,想与任何可能遇到它的人分享

我的代码使用express.js并具有以下特性:

io = require('socket.io').listen(server);
......
io.to(socketId).emit('hello', {userId:userId, data:data, res:res});
它生成了“超出了最大调用堆栈”错误。问题是我不应该通过socketio将变量“res”发送到客户端。我想如果我这样做,会导致一些递归行为

解决方案是从emit语句中删除“res”:

io.to(socketId).emit('hello', {userId:userId, data:data});

这与我在单击“提交”按钮时遇到的错误相同。它被禁用并抛出“超出最大调用堆栈大小”。我重新启动浏览器,它正常工作。奇怪的行为我想与大家分享我在同一问题上的错误:

    public createClient() {
    this.client = new net.Socket();
    this.client.connect(this.port, this.ip, () => {
        this.emit("connect");
    });

    this.client.on("data", (data) => {
        this.emit("data", data);
    });

    this.client.on("close",function () => {
        this.emit("close");
    });

}
在close事件中,使用normal函数和此(错误原因)会导致close事件发出循环,结果是堆栈大小错误

    this.client.on("close", () => {
        this.emit("close");
    });
使用arrow-func(或者将real-this复制成类似于_-this并使用内部函数)解决了这个问题

这实际上是对函数上下文(在回调中)的无知,或者是疏忽。

我也有同样的问题。
对我来说,问题是我在套接字上发射的对象持有对套接字本身的引用。所以我基本上是在套接字内部发送套接字。不要在家里尝试:)

我也遇到了同样的问题,因为我用emit发送了3个对象,我通过只发送一个对象解决了这个问题,但在我的例子中,这有点可笑,因为我实际上是在发送错误事件
socket.on(“error”,new error(err))
在我的
catch
块中。由于
error
是一个私有事件,因此只需更改发出的事件就可以解决此问题。LOL

我在使用Socket.io、express server和p5.js库制作实时白板应用程序时遇到了相同的问题。 我试图使用套接字将p5向量发送到导致错误的服务器

这是我的密码
txtPos=createVector(mouseX/width,mouseY/height);let data={pos:txtPos,txt:”,h:colorSlider.value(),b:brighSlider.value(),size:sizeSlider.value(),};text.push(数据);socket.emit(“newText”,data);

^上面的代码抛出了一个错误,因为我想要发送的数据对象包含了txtPos(p5向量),其中包含了p5对象,其中包含了p5向量,它再次包含了p5对象,并且它会一直持续下去……就像一个递归对象(循环对象)

要解决这个问题,我的新代码非常简单

我换了

pos:txtPos,

pos:{x:txtPos.x,y:txtPos.y,}

猜猜我现在能成功发送这些数据是什么。:D

你能发布完整的错误消息吗?经过编辑的问题包括它,它是:“events.js:72 throw er;//未处理的'error'事件范围错误:超过最大调用堆栈大小”。感谢您添加了问题的原因,在尝试通过socket.io连接发送自递归对象时遇到了相同的问题,并且不知道是什么导致了超过最大调用堆栈大小!哇,今天也遇到了这个问题!如果我没有发现这篇文章,可能又过了一年。虽然错误或者你所面对的是相似的,问题和解决的上下文不同于OP的问题。它也没有给现有的答案增加任何新的价值。请考虑下面的答案指南:最好。