Get name and line of calling function in node.js
Solution 1:
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.
Solution 2:
The following code uses only core elements. It parses the stack from an error instance.
"use strict";
function debugLine(message) {
let e = new Error();
let frame = e.stack.split("\n")[2]; // change to 3 for grandparent func
let lineNumber = frame.split(":").reverse()[1];
let functionName = frame.split(" ")[5];
return functionName + ":" + lineNumber + " " + message;
}
function myCallingFunction() {
console.log(debugLine("error_message"));
}
myCallingFunction();
It outputs something like myCallingFunction:10 error_message
I've extracted the elements of the error as variables (lineNumber, functionName) so you can format the return value any way you want.
As a side note: the use strict;
statement is optional and can be used only if your entire code is using the strict standard. If your code is not compatible with that (although it should be), then feel free to remove it.