追踪meteor/节点光纤中的堆栈溢出

我现在看到了这个崩溃,对节点光纤基础结构不熟悉,不知道从哪里开始解释错误或者检测代码。

Meteor server running on: http://localhost:3000/ W202407-10:06:05.740(-8)? (STDERR) /Users/dauser/.meteor/tools/0b2f28e18b/lib/node_modules/fibers/future.js:173 W202407-10:06:07.363(-8)? (STDERR) throw(ex); W202407-10:06:07.363(-8)? (STDERR) ^ W202407-10:06:07.363(-8)? (STDERR) RangeError: Maximum call stack size exceeded => Exited with code: 8 => Meteor server restarted 

据我了解,有些事情反复激烈,服务器堆栈炸毁,崩溃。 不幸的是,我不知道这个违规的function在哪里 – 我看着我的Deps.autorun呼叫(目前只有一个),似乎并不麻烦。 我的代码没有用显式recursion实现,我没有任何理由怀疑大对象传递。 显然,我当然不确定。

我真的只是在寻找关于如何对代码进行testing以向我展示事情失控的build议。 由于meteor在幕后做了大量的工作,如果有人能给我几个关于在哪里看的指针,那将是非常有用的。

刚刚回到这个位置,在哪里看,我还是很迷茫。 这build议更新到节点0.11.x会给我更多的信息,但这样做似乎并没有添加更多的细节,当它崩溃。

崩溃发生在任何页面交互之后 – 也就是服务器启动并运行正常,但是如果我在浏览器中重新加载或者与页面本身进行交互,BOOM!

受欢迎的需求,这里是服务器代码:

 isAuthorized = () -> console.log "checking authorization" this.userId == Assets.getText('authorizedUsers') Meteor.methods( isAuthorized : isAuthorized filePickerKey : () -> # TODO: properly abstract this, rather than copy/paste... if this.userId == Assets.getText('authorizedUsers') Assets.getText('fpKey') else Meteor.Error 403, 'Error 403: Forbidden') 

future.js的注释行172没有提供更多的细节:

 I2041-15:52:07.363(-8)? Resolve cb threw Maximum call stack size exceeded 

而且,在尝试使用节点检查器时遇到了麻烦。 在过去的半个小时里,我一直在玩这个,所以我可能只是犯了一些基本错误,但是:我通过npm(npm install -g node-inspector)安装了节点检查器。

那么,我试试

 $ node-inspector & [1] 3408 $ Node Inspector v0.6.2 info - socket.io started Visit http://127.0.0.1:8080/debug?port=5858 to start debugging. $ meteor & [2] 3413 $ [[[[[ ~/Projects/indefinite-ways ]]]]] => Meteor server running on: http://localhost:3000/ $ kill -s USR1 3413 Hit SIGUSR1 - starting debugger agent. debugger listening on port 5858 

到现在为止还挺好。 在这一点上,客户端没有打开我的浏览器(即没有选项卡指向localhost:3000)。 我打开一个指向localhost:5858的Chrome选项卡,并查看meteor.js的源代码。我在meteor.js的第6行设置了一个断点

 var Fiber = require('fibers'); 

然后打开meteor客户机标签(localhost:3000),再次popup上面提到的堆栈溢出。 debugging器不会在第6行停止,或以任何其他方式指示它已经注意到。 如果我在第3行设置断点,情况也是如此。

尝试node-inspector ,它允许检查callstack。 这是一个如何使用它的video演示 ,它看起来像铬debugging器(它是相同的基本来源)。

更有用的答案来自非官方的Meteor FAQ :

 $ node-inspector & $ NODE_OPTIONS='--debug-brk' mrt run & 

这将在后台启动节点检查器进程,然后使用正确的debugging标志集启动meteor节点容器侦听。 打开Chrome选项卡到http://127.0.0.1:8080/debug?port=5858让我一步一步。

此外,不是严格的问题的答案,但上面的代码中的违规行似乎是在服务器代码中调用Meteor.Error 。 我仍然乐意接受这个可以确定的答案。 我猜Meteor.Error根本不是EJSONable,试图parsing它,堆栈爆炸。

future.js的第173行将前一个exception转发给下一个监听器。 在你的情况下,下一个监听器就是实例本身,导致堆栈崩溃循环。

编辑你的future.js文件(在OP中引用的path),取消它上面的console.log行的注释…然后你应该看到更详细的解释。 如果console.log输出无助于解决问题,请在此处进行进一步的诊断。

我猜这是关于一个丢失的包,每个线程 。