Nodejs:获取调用者函数的文件名

我不知道如何得到一个函数的调用者的绝对path?

假设:

在文件a.js我叫b() ; b()是文件b.js定义的一个函数。 a.js要求b 。 那么如何从节点中的b.js获得a.js绝对path?

这是一个如何使用stacktrace在节点中查找调用者文件的例子

 function _getCallerFile() { try { var err = new Error(); var callerfile; var currentfile; Error.prepareStackTrace = function (err, stack) { return stack; }; currentfile = err.stack.shift().getFileName(); while (err.stack.length) { callerfile = err.stack.shift().getFileName(); if(currentfile !== callerfile) return callerfile; } } catch (err) {} return undefined; } 

无法恢复prepareStackTrace函数可能会导致问题。 这是一个消除副作用的例子

 function _getCallerFile() { var originalFunc = Error.prepareStackTrace; var callerfile; try { var err = new Error(); var currentfile; Error.prepareStackTrace = function (err, stack) { return stack; }; currentfile = err.stack.shift().getFileName(); while (err.stack.length) { callerfile = err.stack.shift().getFileName(); if(currentfile !== callerfile) break; } } catch (e) {} Error.prepareStackTrace = originalFunc; return callerfile; } 

不完全回答这里的问题,但有些人可能会喜欢这个信息。

使用NodeJS&Forever(-monitor),以下内容包含进程启动的文件名:

 process.mainModule.filename 

虽然没有尝试过很多用途。

这似乎是一个相当不错的解释: https : //code.google.com/p/v8/wiki/JavaScriptStackTraceApi 。

在JavaScript中获取堆栈跟踪相当困难。 我发现的最好的方法是抛出一个错误,抓住它,从Error.getStack() (没有在所有的浏览器,这意味着你的IE浏览器Error.getStack()实现堆栈,并格式化输出。

每个堆栈框架都提供了一个文件path,行号和函数名称。 Webkit甚至支持争论,但是在我上次检查时还没有工作。

然后就是在不同的事件中跟踪代码的问题。

我其实写了一篇关于这个的博客文章: http : //fritsvancampen.wordpress.com/2013/03/28/error-handling-in-javascript-a-better-way/

您可以使用require.resolve(module)来确定require.resolve(module)的完整path:

 var path = require.resolve("a"); //or var path = require.resolve("./a.js"); 

让我们尝试“调用者” – > nodejs调用者模块