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

Ton*_*ony 7 debugging node.js 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);
Run Code Online (Sandbox Code Playgroud)

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

node --debug-brk main.js
node-inspector
Run Code Online (Sandbox Code Playgroud)

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

编辑:我的节点js版本

Tony:~ $ node --version
v0.10.12
Tony:~ $ 
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 11

我使用相同的设置完全陷入了同样的问题.

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

  • 绝对比接受的答案更好的答案. (2认同)

And*_*erg 3

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

原因是 Node 使用自己的模块系统,并且与浏览器中的 Javascript 不同,将变量声明为顶级不会污染全局命名空间。这就是 require(...) 的用武之地。因此,通过将代码包装在立即调用的函数中,您不会获得任何好处(当然,除非您希望您的模块能够同时运行客户端和服务器端)。

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

所以,有两个建议:

  1. require 调用与常规语句不同。它们更类似于Java中的import语句,由编译器专门处理。它们应该始终位于节点文件的顶层。
  2. 在 Node.js 中,无需将代码包装在匿名函数中。