当前位置: 首页 > 面试题库 >

如何在node.js中获取调用方函数的文件路径?

万俟穆冉
2023-03-14
问题内容

这是来自三个文件的一些示例代码:

// foo.js
var myFunc = require("./myFunc");
function foo(){
   myFunc("message");
}

// bar.js
var myFunc = require("./myFunc");
function bar(){
   myFunc("message");
}

// myFunc.js
module.exports = myFunc;
function myFunc(arg1){
   console.log(arg1);
   // Here I need the file path of the caller function
   // For example, "/path/to/foo.js" and "/path/to/bar.js"
}

我需要动态获取调用方函数的文件路径,而无需传递任何额外的参数myFunc


问题答案:

您需要弄弄的内部运作v8。请参阅:有关JavaScript Stack Trace
API的Wiki条目

我已经对提议的提交中的某些代码进行了一些测试,它似乎可以工作。您最终会走上一条绝对之路。

// omfg.js

module.exports = omfg

function omfg() {
  var caller = getCaller()
  console.log(caller.filename)
}

// private

function getCaller() {
  var stack = getStack()

  // Remove superfluous function calls on stack
  stack.shift() // getCaller --> getStack
  stack.shift() // omfg --> getCaller

  // Return caller's caller
  return stack[1].receiver
}

function getStack() {
  // Save original Error.prepareStackTrace
  var origPrepareStackTrace = Error.prepareStackTrace

  // Override with function that just returns `stack`
  Error.prepareStackTrace = function (_, stack) {
    return stack
  }

  // Create a new `Error`, which automatically gets `stack`
  var err = new Error()

  // Evaluate `err.stack`, which calls our new `Error.prepareStackTrace`
  var stack = err.stack

  // Restore original `Error.prepareStackTrace`
  Error.prepareStackTrace = origPrepareStackTrace

  // Remove superfluous function call on stack
  stack.shift() // getStack --> Error

  return stack
}

以及一个包含omfg模块的测试:

#!/usr/bin/env node
// test.js

var omfg = require("./omfg")

omfg()

您将在控制台上找到的绝对路径test.js

说明

这不是一个“ node.js”问题,而是一个“ v8”问题。

请参阅:用于自定义异常的堆栈跟踪集合

Error.captureStackTrace(error, constructorOpt)向该error参数添加一个stack属性,该属性默认情况下计算为String(通过FormatStackTrace)。如果Error.prepareStackTrace(error, structuredStackTrace)Function,则调用而不是FormatStackTrace

因此,我们可以Error.prepareStackTrace使用自己的函数覆盖该函数,该函数将返回我们想要的任何东西-
在这种情况下,仅返回structuredStackTrace参数。

然后,structuredStackTrace[1].receiver是一个代表调用者的对象。



 类似资料:
  • 问题内容: 我想知道如何获取函数调用者的绝对路径? 可以这样说: 在文件中我打电话; 是file中定义的函数。要求。那么,如何从节点中获取绝对路径? 问题答案: 这是一个如何使用stacktrace在节点中查找调用方文件的示例

  • 问题内容: 如何获得调用当前函数的函数的名称和行?我想要一个像这样的基本调试功能(使用npmlog定义): 当从另一个函数调用时,它将是这样的: 为了清楚起见,我想要的基本上与[ython中的类似: 是否有等效的Node来完成此任务? 问题答案: 您可以添加一些原型以提供从V8访问此信息的权限: 分别返回“ 28”和“ foo”。

  • 问题内容: 我正在编写一个脚本,以自动将一个文件中的特定文本集更改为另一个文件中具有不同名称的特定集。 我想使用该函数获取文件名,但是当我尝试打印文件名时,它返回: 我只需要文件名,因为不能写脚本。 有什么建议删除多余的位吗? 问题答案: 返回所选文件的路径;如果未选择文件,则返回空字符串: 要打开通过选择的文件,您可以简单地使用常规的Python构造和函数,例如 函数: 我认为您正在使用,它将打

  • 问题内容: 给定Python中的类C,如何确定该类在哪个文件中定义?我需要可以从类C或从关闭C的实例工作的东西。 我这样做的原因是因为我通常不喜欢将属于同一文件的文件放在同一文件夹中。我想创建一个使用Django模板将其自身呈现为HTML的类。基本实现应根据定义类的文件名来推断模板的文件名。 假设我在文件“ base / artifacts.py”中放置了一个LocationArtifact类,那

  • 问题内容: 我知道函数,但是我正在寻找一些易于使用的函数实现?如果它也提供了方法的类(如果确实是方法),那将是完美的。 问题答案: 该函数是了解这一点的唯一方法,如果您很懒,这是您自己编写代码的另一个原因。 对抗懒惰! :D

  • 问题内容: 要修复测试用例,我需要确定是否从特定的调用程序函数中调用了该函数。我负担不起添加布尔值参数,因为它会破坏定义的接口。怎么办呢? 这是我想要实现的。在这里,我无法更改operation()的参数,因为它是接口实现。 问题答案: 你可以试试