Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get name and line of calling function in node.js

How can one get the name and line of a function that called the current one? I would like to have a rudimentary debugging function like this (with npmlog defining log.debug):

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

When called from another function it would be something like this:

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

For clarity, what I want is essentially analogous to this in Python:

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

Is there a Node equivalent to accomplish this?

like image 913
Brian M. Hunt Avatar asked Jan 05 '13 13:01

Brian M. Hunt


1 Answers

Using info from here: Accessing line number in V8 JavaScript (Chrome & Node.js)

you can add some prototypes to provide access to this info from 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() 

Returns '28' and 'foo', respectively.

like image 169
Joe Avatar answered Sep 20 '22 18:09

Joe