我现在看到这次崩溃,对节点光纤基础设施不够熟悉,无法知道从何处开始解释错误或检测代码......
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
据我了解,有些东西反复出现,服务器堆栈爆炸,崩溃。不幸的是,我不知道这个有问题的功能在哪里 - 我看了我的Deps.autorun电话(目前只有一个),这似乎不是麻烦。我的代码都没有用显式递归实现,我没有任何理由怀疑传递大对象。显然,我当然不太确定。
我真的只是在寻找有关如何检测代码的建议,以向我展示事情失控的地方。由于Meteor在幕后做了大量工作,如果有人能给我一些关于在哪里看的指示,那将是非常有用的。
回到这一点,我仍然很遗憾在哪里看。 this建议更新到节点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
而且,这是我在尝试使用node-inspector时遇到的麻烦。过去半小时我一直在玩这个,所以我可能只是犯了一些基本错误,但是: 我通过npm安装了node-inspector(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),再次弹出上述堆栈溢出。调试器不会在第6行停止,或以任何其他方式表示它已注意到。如果我在第3行设置断点,情况也是如此。
答案 0 :(得分:4)
尝试node-inspector,它允许检查callstack。这是video presentation如何使用它,在视觉上它看起来像chrome调试器(它是相同的基础源)。
答案 1 :(得分:2)
稍微有用的答案来自unofficial Meteor FAQ:
$ node-inspector &
$ NODE_OPTIONS='--debug-brk' mrt run &
这将在后台启动节点检查器进程,然后使用正确的调试标志集启动meteor的节点容器侦听。打开Chrome标签页以http://127.0.0.1:8080/debug?port=5858
,让我一步一步。
此外,严格问题的答案,但上面代码中的违规行似乎是在服务器代码中调用Meteor.Error
。我仍然乐意接受这个可以确定的答案。我猜测Meteor.Error根本不是EJSONable,并且在尝试解析它时,堆栈会爆炸。
答案 2 :(得分:1)
Line 173 of future.js将异常转发给下一个侦听器。在您的情况下,下一个侦听器就是实例本身,导致堆栈崩溃循环。
编辑你的future.js文件(OP中引用的路径)并取消注释它上方的console.log行...然后你应该看到更详细的解释。如果console.log输出无法解决,请在此处发布以进行进一步诊断。
根据this thread,我的猜测是与丢失的包有关。