Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-诊断";(节点)警告:检测到递归进程.nextTick。”;_Javascript_Node.js_Stack Overflow - Fatal编程技术网

Javascript Node.js-诊断";(节点)警告:检测到递归进程.nextTick。”;

Javascript Node.js-诊断";(节点)警告:检测到递归进程.nextTick。”;,javascript,node.js,stack-overflow,Javascript,Node.js,Stack Overflow,在我的应用程序中,一个操作需要很长时间才能完成,然后会打印以下消息的数百个实例: (node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral. 然后应用程序崩溃,原因是: RangeError: Maximum call stack size exceeded 没有

在我的应用程序中,一个操作需要很长时间才能完成,然后会打印以下消息的数百个实例:

(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
然后应用程序崩溃,原因是:

RangeError: Maximum call stack size exceeded
没有堆栈跟踪

如何诊断此类错误?例如,我想知道在
RangeError
之前是哪个函数调用

要复制错误,请在文件
foo.js
上运行包含以下内容的
node foo.js

var foo = function () {
    process.nextTick(foo);
};
foo();
我对应用程序中此问题的特定原因不太感兴趣,而是了解如何在节点中诊断此类问题


节点版本为
v0.10.39

您可以替换
进程。nextTick
以打印某种有用的信息–大致如下:

var _nextTick = process.nextTick;
var alreadyLogged = new Set();

process.nextTick = function nextTick(f) {
    if (!alreadyLogged.has(f)) {
        alreadyLogged.add(f);

        process.nextTick = _nextTick;
        console.log(f);
        process.nextTick = nextTick;
    }

    return _nextTick.apply(this, arguments);
};

我不确定这是如何解决这个问题的。这会阻止递归,但不会记录导致递归的原因?而且,当检测到递归调用时,它不会记录。而且,当您第二次调用
process.nextTick()
并传递相同的函数时,它也将被阻止,因为
集合
从未被清除。这似乎是一个有趣的方向,但还不到实现的一半。@jfriend00:对不起,这只是一个错误。它不是为了阻止递归;我尝试了这个方法,但在我的应用程序中,我在启动时得到了“RangeError:超出了最大调用堆栈大小”。另一个函数
function(){afterWrite(stream,state,finished,cb);}
在我切换到记录
toString
f
@Jackson:对不起,请尝试更新版本
console.log
使用
process.nextTick
,因此在使用它时必须还原原始版本。
节点--trace foo.js>trace.log
可能会让你有所收获,但我怀疑它在实际应用中是否可用,因为它可能会引入太多副作用。