I am new to Node.JS. I am knocking some utility functions for an existing application.
I have added these functions:
/** * * @returns the current stacktrace */ function getStackTrace() { var orig = Error.prepareStackTrace; Error.prepareStackTrace = function(_, theCallStack) { return theCallStack; }; var err = new Error; Error.captureStackTrace(err, arguments.callee); var stack = err.stack; Error.prepareStackTrace = orig; return stack; } /** * Gets the name of the function which called the function which calls this function. * E.g first() calls seconds(), which calls this function; the return value will be the string 'first, since second, * which called this, wants to know who called it. * * @param[depth] : Optional, default = 1, allows us to examine the call stack at different depths, should we wish to */ exports.getCallingFunctionName = (depth = 1) => { try{ const theCallStack = getStackTrace(); if (depth < theCallStack.length) return theCallStack[depth].getFunctionName(); else return '????'; // ToDo: Should prolly raise an exception } catch(e) { //FixMe: CodeMe: console.log('Aaaaaaaaaaaaargh!!!! ' + e); } }
and getCallingFunctionName()
is called by logCallAndStartProfiling
which is declared in a different file, utils.js, as exports.logCallAndStartProfiling = function(){ ... etc
.
When I look at the result of getCallingFunctionName()
, I see exports.logCallAndStartProfiling
whereas I would prefer to see utils.logCallAndStartProfiling
. Can I achieve this somehow by redeclaring the export, using a different syntax? Currently, I use var exports = (module.exports = {});
.
Btw, for reasons that I won’t go into, TypeScript is not currently an option, although I will move to it later, but do not have, and cannot get, permission to do so just yet.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I am not sure if you will be able to do this easily.
I prepared a solution, but I am not sure if you will like it 😀
const { logCallAndStartProfiling } = require('./utils') logCallAndStartProfiling()
const utils = require('./other') exports.logCallAndStartProfiling = function () { const functionName = utils.getCallingFunctionName(__filename) console.log(functionName) }
const path = require('path') function getStackTrace() { const orig = Error.prepareStackTrace Error.prepareStackTrace = function (_, theCallStack) { return theCallStack } const err = new Error() Error.captureStackTrace(err, arguments.callee) const stack = err.stack Error.prepareStackTrace = orig return stack } exports.getCallingFunctionName = (fileName, depth = 1) => { try { const theCallStack = getStackTrace() if (depth >= theCallStack.length) return null const originalFunctionName = theCallStack[depth].getFunctionName() const functionName = originalFunctionName.split('exports.')[1] const baseFileName = path.basename(fileName).split('.js')[0] return `${baseFileName}.${functionName}` } catch (e) { return null } }
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0