警告:检测到递归process.nextTick

时间:2014-03-25 19:42:27

标签: javascript node.js recursion gruntjs

我有申请,我开始合作,我只想运行它,但它崩溃了。它使用grunt,运行节点服务器,它的Angular.js应用程序。当我运行运行服务器的grunt任务时,当我尝试从浏览器访问应用程序时,我收到了来自grunt或节点的警告:

(node) warning: Recursive process.nextTick detected. This will break in the next
version of node. Please use setImmediate for recursive deferral.

很多行和最终:

util.js:35
  var str = String(f).replace(formatRegExp, function(x) {
                      ^
RangeError: Maximum call stack size exceeded Use --force to continue.

    Aborted due to warnings.

我尝试在我的应用中搜索process.nextTick,但它位于node_modules目录中的很多位置,而不是src

是否可以删除该警告以便我可以运行该应用程序?我应该用什么代码搜索这个递归调用?

更新

我使用ack并发现此行来自3个地方的此文件:

$REPO/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/‌​readable- stream/node_modules/core-util-is/float.patch
$REPO/node_modules/grunt-browser-sync/node_modules/browser-sync/node_modules/connect/‌​node_modu les/multiparty/node_modules/readable-stream/node_modules/core-util-is/float.patc‌​h 
/usr/lib/node_modules/bower/node_modules/decompress-zip/node_modules/readable-s‌​tream/nod e_modules/core-util-is/float.patch

但它不是js文件。

4 个答案:

答案 0 :(得分:7)

这可能是一个咕噜咕噜的问题。如果你的命名约定重复,Grunt会呕吐。

这会破坏:

grunt.registerTask('foo', [ 'foo']);

这不会:

grunt.registerTask('foo', [ 'bar']);

查看此SO帖子:grunt throw "Recursive process.nextTick detected"

答案 1 :(得分:3)

npm dedupe为我解决了这个问题。基本上它减少了包重复:

  

搜索本地包树并尝试通过在树中进一步向上移动依赖关系来简化整体结构,在那里它们可以被多个依赖包更有效地共享。

More information

答案 2 :(得分:1)

在我的情况下,我在抛出此错误之前收到以下警告:

Running "watch" task
Waiting...
Warning: watch ENOSPC

(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.

此错误表示它尝试观看的资源数量高于此用户的限制。这就是以root用户身份运行(没有这些限制)的原因。但这不是解决方案。

了解您的用户在Linux中的限制:

sysctl --all | grep watches

尝试增加当前用户的手表数量:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

这应该可以解决问题。

答案 3 :(得分:0)

由我在此发布:grunt throw "Recursive process.nextTick detected"

替代解决方案:检查您的监视是否存在空文件参数

这是我的gruntfile

的摘录
watch: {
  all: {
    options:{
      livereload: true
    },
    files: ['src/scss/*.scss', 'src/foo.html',, 'src/bar.html'],
    tasks: ['default']
  }
}

在我的情况下,我可以使用上面的空参数重新创建原始海报的错误。