一尘不染

在node.js中获取调用函数的名称和行

node.js

如何获得调用当前函数的函数的名称和行?我想要一个像这样的基本调试功能(使用npmlog定义log.debug):

function debug() {
  var callee, line;
  /* MAGIC */
  log.debug(callee + ":" + line, arguments)
}

当从另一个函数调用时,它将是这样的:

function hello() {
   debug("world!")
}
// outputs something like:
// "hello:2 'world!'"

为了清楚起见,我想要的基本上与[ython中的类似:

import inspect
def caller():
    return inspect.stack()[2][3]
// line no from getframeinfo().lineno

是否有等效的Node来完成此任务?


阅读 649

收藏
2020-07-07

共1个答案

一尘不染

您可以添加一些原型以提供从V8访问此信息的权限:

Object.defineProperty(global, '__stack', {
get: function() {
        var orig = Error.prepareStackTrace;
        Error.prepareStackTrace = function(_, stack) {
            return stack;
        };
        var err = new Error;
        Error.captureStackTrace(err, arguments.callee);
        var stack = err.stack;
        Error.prepareStackTrace = orig;
        return stack;
    }
});

Object.defineProperty(global, '__line', {
get: function() {
        return __stack[1].getLineNumber();
    }
});

Object.defineProperty(global, '__function', {
get: function() {
        return __stack[1].getFunctionName();
    }
});

function foo() {
    console.log(__line);
    console.log(__function);
}

foo()

分别返回“ 28”和“ foo”。

2020-07-07