70

現在の関数を呼び出した関数の名前と行を取得するにはどうすればよいですか?このような基本的なデバッグ機能が必要です(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

これを達成するのに相当するノードはありますか?

4

6 に答える 6

91

ここからの情報を使用: Accessing line number in 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」を返します。

于 2013-01-05T14:38:26.457 に答える
13

node-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'
};
于 2013-01-05T14:37:59.920 に答える
1

エラーが発生したときにファイル名を取得する方法を次に示します。onErrorReturnFileName で関数をラップする必要があります。func()ここでは、ファイルからラップしていotherNodeます。

const {func} = require('./otherNode')

function onErrorReturnFileName(funcToRead) {
    let defaultPrepareStackTrace = Error.prepareStackTrace
    try {
        let getStack = function (err, stack) { return stack; };
        Error.prepareStackTrace = getStack
        return {result: funcToRead(), name: null}
    }catch (ex) {
        return {name: ex.stack.shift().getFileName(), result: null}
    }
    Error.preppareStackTrace = defaultPrepareStackTrace
}
console.log(onErrorReturnFileName(func))
于 2021-05-25T17:59:54.737 に答える