我在Intellij中调试NodeJS应用程序。我有一个方法如下:
function(connection) {
connection.on('error', function(error) {
console.log('there is an error'); // breakpoint is on this line
});
}
当点击断点时,未定义connection
,并且在评估表达式窗口中放置connection
会产生“ReferenceError:未定义连接。”
在我看来connection
正在被解除分配,因为它没有在回调中使用,但是我正在调试应用程序,所以我怎样才能使它不被释放,除了添加行{{ 1}}(确实有效)。
这是另一个例子:
localConnection = connection
此处,调试器无法访问var foo = (function() {
var a = 'some value';
this.bar = function() {
console.log('bar'); // breakpoint is here
};
this.bar();
})();
。
修改:
为了澄清第二个例子,a
对于在a
之外声明的方法是私有的,但不是。一个很好的例子:
foo
此示例会打印“a:某些值”,表示该行中应该可以访问var foo = (function() {
var a = 'Some value';
this.bar = function() {
console.log('a: ' + a); // breakpoint is here
};
this.bar();
})();
。事实上,只需将其添加到控制台日志中,它就可以在该行中保持可访问状态,这表明其先前的不可访问性是由于垃圾收集或引用计数,在调试环境中,我希望不那么严谨,因为我希望能够保持在调试时看到代码中不一定使用的变量值的能力。
这同样适用于第一个例子。在代码中的回调中使用a
时,它会暴露给调试器,但我试图让它在没有代码使用的情况下保持暴露。我怎么做?我非常肯定有一个Node的运行时标志来完成它。
答案 0 :(得分:0)
第一个例子,connection是一个事件发射器。所以当“错误”事件发生时,外部函数已经完成工作。所以你无法取回它。第二个例子是IIFE,而“a”在某种程度上是私有变量,即使看起来不像那样。
您可以使用全局变量来访问它们。我知道这看起来像一个肮脏的解决方法。但它仍然有效,这是一个例子:
var m;
function(connection) {
m = connection;
connection.on('error', function(error) {
console.log('there is an error'); // breakpoint is on this line
console.log(m); // now you can access connection
});
}