本文目录

Node.js 获取调用者函数的文件路径

🌙
手机阅读
本文目录结构

以下是三个文件的示例代码:

// 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的内部工作。见:the wiki entry about the JavaScript Stack Trace API

我在 a proposed commit 的一些代码基础上进行了一些测试,似乎有效。你最终得到一个绝对的路径。

// 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”问题。

见:Stack Trace Collection for Custom Exceptions

Error.captureStackTrace(error, constructorOpt) 将错误参数添加到堆栈属性,该属性的默认值为String(通过 FormatStackTrace )。如果 Error.prepareStackTrace(error,structuredStackTrace)是一个Function,则调用它而不是FormatStackTrace

所以,我们可以用我们自己的函数来覆盖Error.prepareStackTrace,它将返回任何我们想要的结果 – 在这种情况下,只有structStackTrace参数。

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

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了