了解“RangeError:超出最大调用堆栈大小”

时间:2015-01-16 17:29:13

标签: node.js socket.io lodash winston

我对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?
或许是因为我不习惯异步编程? 这个错误背后有详细原因吗?
如何确保此错误不会再次发生?

1 个答案:

答案 0 :(得分:2)

循环引用将创建错误,因为它不会计算为声明的值(数字,字符串,布尔值),也不会计算为“未定义”。相反,循环引用将在无限循环中跟随,并且没有停止它的机制,程序例程将消耗可用内存并且可能抛出错误并崩溃。避免像瘟疫这样的循环引用。

在你的代码中 - 如果data引用自身,那么这肯定是导致超出最大调用堆栈大小的原因。