Obtenir le nom et la ligne d'appel dans node.js

Comment peut-on obtenir le nom et la ligne d'une fonction qui s'appelle la version actuelle? Je voudrais avoir une fonction de débogage rudimentaire comme celle-ci (avec npmlog définissant log.debug ):

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

Lorsqu'il est appelé à partir d'une autre fonction, ce serait quelque chose comme ceci:

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

Pour plus de clarté, ce que je veux est essentiellement analogue à cela en Python :

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

Existe-t-il un noeud équivalent pour y parvenir?

Utilisation de l'information à partir d'ici: Accès au numéro de ligne dans V8 JavaScript (Chrome & Node.js)

Vous pouvez ajouter des prototypes pour donner accès à cette information à partir de 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() 

Renvoie '28' et 'foo', respectivement.

J'ai trouvé et installé le module node-stack-trace (installé avec npm install stack-trace ), puis j'ai défini l' echo comme suit:

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

J'avais aussi une exigence similaire. J'ai utilisé la propriété stack de la classe Error fournie par nodejs.
Je suis toujours en train d'apprendre le nœud, alors il se peut qu'il y ait des chances d'erreur.

Voici l'explication de la même chose. Aussi créé npm module pour le même, si vous le souhaitez, vous pouvez vérifier à:
1. module npm 'logat'
2. git repo

Supposons que nous "enregistrons" l'objet avec la méthode '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); } 

Exemple:

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

Sortie de l'exemple ci-dessus:

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