You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TS/Node.js:无需传入构造函数,获取类实例创建文件的绝对路径

如何在类构造函数中获取实例创建文件的__dirname(无需传入路径)

要实现这个需求,核心思路是通过调用栈追踪定位到new A()的执行位置,进而提取对应的文件路径并获取其__dirname。下面分享两种可靠的方案,同时回应你遇到的问题:

方案一:解析Error.stack(无需额外依赖)

利用Node.js中Error对象的stack属性,我们可以手动解析调用栈信息,找到实例创建的文件路径:

// src/classes/A.ts
import path from 'path';

export class A {
  private instanceDirname: string;

  constructor() {
    const err = new Error();
    // 调用栈的第2帧(索引1)对应`new A()`的执行位置
    const callFrame = err.stack?.split('\n')[2];
    if (!callFrame) {
      throw new Error('无法追踪到实例创建位置');
    }

    // 提取文件路径(适配Node.js常见的栈帧格式,比如`at Object.<anonymous> (/path/to/src/index.ts:3:13)`)
    const pathMatch = callFrame.match(/\((.*):\d+:\d+\)$/);
    if (!pathMatch) {
      throw new Error('解析文件路径失败');
    }

    const filePath = pathMatch[1];
    this.instanceDirname = path.dirname(filePath);
  }
}

优缺点

  • ✅ 无需安装任何第三方依赖
  • ❌ 依赖Error.stack的格式,不同Node.js版本可能略有差异,需要做兼容性适配

方案二:使用Node.js内置的v8 Stack Trace API(更稳定)

Node.js内置的v8模块提供了官方的栈追踪API,能更精准地获取调用帧信息,避免正则解析的兼容性问题:

// src/classes/A.ts
import path from 'path';
import { getCallSite } from 'v8';

export class A {
  private instanceDirname: string;

  constructor() {
    // 跳过当前构造函数的帧:索引0是`getCallSite`,索引1是A的构造函数,索引2是`new A()`的执行位置
    const callSite = getCallSite(2);
    if (!callSite) {
      throw new Error('无法追踪到实例创建位置');
    }

    const filePath = callSite.getFileName();
    if (!filePath) {
      throw new Error('无法获取文件路径');
    }

    this.instanceDirname = path.dirname(filePath);
  }
}

优缺点

  • ✅ 基于官方API,调用栈信息的获取更稳定,无需担心格式变化
  • ✅ 直接通过调用帧方法获取文件路径,比正则解析更可靠
  • ❌ 需要注意调用帧的索引,确保跳过当前构造函数的层级

关于你尝试过的方案的说明

  • callsite模块:它本质也是基于Error.stack的解析,正则提取确实容易遇到格式兼容性问题,改用v8的官方API可以避免这个痛点。
  • caller-callsite模块:它返回模块路径而非实例创建路径,大概率是因为调用帧的索引定位错误,没有精准指向new A()的执行位置,用上面的v8方案可以精准定位到目标帧。

注意事项

  1. 这些方案依赖Node.js的调用栈追踪功能,如果生产环境开启了栈追踪优化(比如--no-stack-trace),可能会失效。
  2. 如果实例是在REPL、动态生成代码或非文件环境中创建的,filePath可能为空,需要添加边界处理逻辑。

内容的提问来源于stack exchange,提问作者Ibrahim A. Elaradi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:27:41