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

如何在Node.js中获取当前执行函数的名称?

严格模式下自动获取函数名作为Span名称的可行方案

在严格模式禁用caller/arguments的场景下,有几种可靠的方式自动获取函数名来标准化Span创建:

方案一:高阶函数封装(推荐)

通过高阶函数包裹需要追踪的函数,直接利用Function.prototype.name获取函数名,无需依赖栈追踪,兼容性和稳定性最好:

// 封装Span创建逻辑的高阶函数
function withSpan(targetFunc) {
  return function(...args) {
    // 直接获取原函数的名称,匿名函数会返回空字符串,可 fallback 到'unknown'
    const spanName = targetFunc.name || 'unknown';
    
    // 这里替换为你的Span初始化逻辑
    console.log(`初始化Span: ${spanName}`);
    
    // 执行原函数并保留上下文和返回值
    const result = targetFunc.apply(this, args);
    
    // 替换为Span结束逻辑
    console.log(`结束Span: ${spanName}`);
    
    return result;
  };
}

// 使用示例:包裹需要追踪的业务函数
const processPayment = withSpan(function handlePayment() {
  // 业务逻辑代码
  console.log('处理支付中...');
});

processPayment();

如果是类方法,同样可以用这个思路,或者结合装饰器语法(需ES装饰器支持):

// 类方法装饰器版本
function spanDecorator(target, methodName, descriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args) {
    // 拼接类名和方法名,更适合类场景的Span命名
    const spanName = `${target.constructor.name}.${methodName}`;
    
    console.log(`初始化Span: ${spanName}`);
    const result = originalMethod.apply(this, args);
    console.log(`结束Span: ${spanName}`);
    
    return result;
  };
  return descriptor;
}

// 使用示例
class PaymentService {
  @spanDecorator
  handlePayment() {
    console.log('处理支付中...');
  }
}

new PaymentService().handlePayment();

方案二:优化错误栈提取(适合必须在函数内部动态获取的场景)

如果无法用高阶函数包裹,可优化栈追踪逻辑,兼容不同环境的栈格式,比你之前的正则更可靠:

function getCurrentFunctionName() {
  const stackHolder = {};
  // 捕获栈并排除当前函数本身的帧
  Error.captureStackTrace(stackHolder, getCurrentFunctionName);
  
  const stackLines = stackHolder.stack?.split('\n');
  if (!stackLines || stackLines.length < 2) return 'unknown';
  
  const targetLine = stackLines[1];
  // 兼容Chrome/Node.js(格式:at functionName (...))和Firefox(格式:functionName@...)
  const matchResult = targetLine.match(/(?:at\s+)?([\w.]+)(?:\s|\@)/);
  
  return matchResult ? matchResult[1] : 'unknown';
}

// 使用示例
function validateOrder() {
  console.log(getCurrentFunctionName()); // 输出validateOrder
}

validateOrder();

这个方法通过Error.captureStackTrace精准控制栈帧,避免捕获当前工具函数的栈信息,同时用更通用的正则匹配不同环境的栈格式,比原始方案更稳定。


内容的提问来源于stack exchange,提问作者Supperhero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:57:50