缺少NodeJS堆栈跟踪中的函数名称;为什么?

时间:2015-06-07 16:25:22

标签: javascript node.js

OS X下的NodeJS v0.10.31,在NodeJS v0.12.2下的相同行为。

正常调用时,我的堆栈跟踪不显示test函数名称:

function test() {
  throw new Error('Missing `test` in stack trace?');
}

try {
  test();
} catch (e) {
  console.trace(e);
}

输出:

Trace: [Error: Missing `test` in stack trace?]
    at Object.<anonymous> (no_stack_in_node.js:8:11)
    // etc.

如果它在setTimeout内,我会看到我的期望:

try {
  setTimeout(test, 0);
} catch (e) {
  console.trace(e);
}

输出:

Error: Missing `test` in stack trace?
    at test [as _onTimeout] (no_stack_in_node.js:2:9)
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

在浏览器中,我在两种情况下都会看到后者。

是否有某些特定的东西我缺失,或者是NodeJS的CLI干扰环境,例如,“顶级对象”的行为有点不同?

1 个答案:

答案 0 :(得分:2)

在Node.js中,模块中的所有代码都将包装在匿名函数中,如下所示

(function (exports, require, module, __filename, __dirname) {
    // our actual module code
});

所以你的实际代码会像这样包装

(function (exports, require, module, __filename, __dirname) {
    function test() {
        throw new Error('Missing `test` in stack trace?');
    }

    try {
        test();
    } catch (e) {
        console.trace(e);
    }
});

有关详细说明,请参阅scipy.ndimage.zoom

因此,当您跟踪e的位置时,它实际上是一个匿名函数。这就是为什么它说Object.<anonymous>