使用require inside闭包时,无法在函数内设置断点

时间:2013-07-18 08:45:33

标签: node.js debugging requirejs webstorm node-inspector

使用node-inspector,我无法在以下node.js代码中设置断点。 (内容main.js

(function() {
    require('underscore');

    var doSomething = function(callback) {
        callback('doSomething Finished');
    }

    doSomething(function(x) {
       console.log(x);
    });

}).call(this);

我可以轻松地在第2行,第4行或第8行设置断点,但无论我怎么努力,调试器都不会让我在第5行或第9行设置断点。要清楚,我' m使用以下命令运行node-inspector

node --debug-brk main.js
node-inspector

我也尝试在网络风暴中进行调试,但问题仍然存在。如果我删除行require('underscore');,那么问题会立即消失,我可以再次在函数体内设置断点。如果我删除最外面的闭包函数,问题也会消失。似乎require和文件级关闭之间的交互正在搞砸节点调试功能。有没有人自己经历过这个问题和/或知道能够打破功能体内的任何变通方法?

编辑:我的节点js版本

Tony:~ $ node --version
v0.10.12
Tony:~ $ 

2 个答案:

答案 0 :(得分:11)

我使用相同的设置完全陷入同样的​​问题。

我在目标函数的定义之后添加了一个断点(这是我实际上可以添加断点的唯一地方)。当调试器到达该断点并且实际定义了该函数时,我能够将断点添加到实际的目标函数中......

答案 1 :(得分:3)

这可能不是您想要听到的答案,因为它没有解释为什么您不能设置任何断点,但我只是从闭包中删除您的require语句并将其置于顶级。我会更进一步,并建议你不要使用像上面那样的闭包。

原因是节点使用自己的模块系统,与浏览器中的Javascript不同,声明顶级变量不会污染全局命名空间。这就是require(...)的用武之地。所以,通过将代码包装在一个立即调用的函数中,你什么也得不到(除非你希望你的模块能够同时运行客户端和服务器端)。

我猜你无法设置任何断点的原因是V8运行时识别出一个不必要的闭包,然后为你优化代码。重写的代码可能没有正确的源映射,因此无法设置断点。

所以,有两个建议:

  1. 要求通话不像常规报表。它们与Java中的import语句更相似,并且由编译器专门处理。它们应始终位于节点文件中的顶级。
  2. 在Node中无需将代码包装在匿名函数中。