Get name and line of calling function in node.js


Question

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?

1
47
5/23/2017 12:26:10 PM

Accepted Answer

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.

68
5/23/2017 10:31:13 AM

I also had similar requirement. I used stack property of Error class provided by nodejs.
I am still learning node so, there may be the chances of error.

Below is the explanation for the same. Also created npm module for the same, if you like, you can check at:
1. npm module 'logat'
2. git repo

suppose we 'logger' object with method '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);
}

Example:

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

Output of above Example:

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

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon