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调用者模块