javascript - node教程 - require用法




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

从此处使用信息: 在V8 JavaScript中访问行号(Chrome和Node.js)

您可以添加一些原型以提供从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”。

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

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

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

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

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

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

是否有一个等效的节点来完成此任务?


以下代码仅使用核心元素。 它从错误实例解析堆栈。

"use strict";
function debugLine(message) {
    let e = new Error();
    let frame = e.stack.split("\n")[2];
    let lineNumber = frame.split(":")[1];
    let functionName = frame.split(" ")[5];
    return functionName + ":" + lineNumber + " " + message;
}
function myCallingFunction() {
    console.log(debugLine("error_message"));
}
myCallingFunction();

它输出类似于 myCallingFunction:10 error_message

我已将错误的元素提取为变量(lineNumber,functionName),因此您可以按任意方式设置返回值的格式。

附带说明: use strict; 语句是可选的,仅当您的整个代码都使用 strict 标准时才可以使用。 如果您的代码与此不兼容(尽管应该兼容),请随时将其删除。


我找到并安装了 node-stack-trace 模块(与 npm install stack-trace 一起 npm install stack-trace ),然后将 echo 定义为:

function echo() {
  var args, file, frame, line, method;
  args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];

  frame = stackTrace.get()[1];
  file = path.basename(frame.getFileName());
  line = frame.getLineNumber();
  method = frame.getFunctionName();

  args.unshift("" + file + ":" + line + " in " + method + "()");
  return log.info.apply(log, args); // changed 'debug' to canonical npmlog 'info'
};




node.js