javascript - 호출 - server js




node.js에서 이름과 호출 라인을 가져옵니다. (3)

현재 함수를 호출 한 함수의 이름과 라인을 어떻게 얻을 수 있습니까? 다음과 같은 기본적인 디버깅 기능을 npmlog ( npmlog 정의 log.debug ).

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

다른 함수에서 호출하면 다음과 같습니다.

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

명확성을 위해, 내가 원하는 것은 본질적 으로 파이썬 에서 이것 과 유사합니다.

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

이것을 달성하기 위해 동등한 노드가 있습니까?


나도 비슷한 요구 사항이 있었다. nodejs가 제공하는 Error 클래스의 stack 속성을 사용했습니다.
나는 여전히 노드를 배우고 있으므로 오류가 발생할 수 있습니다.

아래는 동일한 설명입니다. 원하는 경우 동일한 npm 모듈을 만들었습니다. 원하는 경우 다음을 확인할 수 있습니다.
1. npm 모듈 'logat'
git repo

'log'메소드를 사용하여 '로거'오브젝트를 가정하십시오.

var logger = {
 log: log
}
function log(msg){
  let logLineDetails = ((new Error().stack).split("at ")[3]).trim();
  console.log('DEBUG', new Date().toUTCString(), logLineDetails, msg);
}

예:

//suppose file name: /home/vikash/example/age.js
function getAge(age) {
    logger.log('Inside getAge function');    //suppose line no: 9
}

위 예의 출력 :

    DEBUG on Sat, 24 Sept 2016 12:12:10 GMT at getAge(/home/vikash/example/age.js:9:12)
    Inside getAge function

다음 코드는 핵심 요소 만 사용합니다. 오류 인스턴스에서 스택을 구문 분석합니다.

"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 와 같은 것을 출력합니다 myCallingFunction:10 error_message

오류 요소를 변수 (lineNumber, functionName)로 추출하여 원하는 방식으로 반환 값의 형식을 지정할 수 있습니다.

참고로 : use strict; statement는 선택 사항이며 전체 코드가 strict 표준을 사용하는 경우에만 사용할 수 있습니다. 코드가 해당 코드와 호환되지 않는 경우 (제거해야 함) 자유롭게 제거하십시오.


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'
};




node.js