我对Node.JS比较陌生,我正在开发一款在线游戏,当我偶然发现这个错误时:
events.js:72
throw er: // Unhandled 'error' event
^
RangeError: Maximum call stack size exceeeded
错误没有显示我的代码中断/结束的位置,我使用console.log
进行了一些简单的调试,我知道我的程序以某种方式结束:
game.on('end', function (data) {
winston.log('info', 'Game %s ended', game.name); // printed
console.log("test - A"); // this is printed
io.to(room.name).emit('game ended', data); // <- I think this one breaks
console.log("test - B"); // this is NOT printed
});
(game
是我自己编写的游戏模块)
现在我真的很困惑。
尝试设置--max-stack-size=100000
,但错误仍然发生。
我的节目最近变得越来越复杂
它使用Socket.IO,Lodash,Winston
我使用了许多Lodash的功能,特别是_.forEach
。
是因为Socket.IO的错误吗?还是Lodash?
或许是因为我不习惯异步编程?
这个错误背后有详细原因吗?
如何确保此错误不会再次发生?
答案 0 :(得分:2)
循环引用将创建错误,因为它不会计算为声明的值(数字,字符串,布尔值),也不会计算为“未定义”。相反,循环引用将在无限循环中跟随,并且没有停止它的机制,程序例程将消耗可用内存并且可能抛出错误并崩溃。避免像瘟疫这样的循环引用。
在你的代码中 - 如果data
引用自身,那么这肯定是导致超出最大调用堆栈大小的原因。