对于Node.js中获取当前函数被调用的行数及文件名这个问题,我们可以通过调用Node.js的Error
对象来实现这个功能。下面就是一个完整的攻略:
使用Error对象获取当前函数被调用的行数及文件名
- 我们可以在函数内部手动抛出一个错误,然后利用这个错误,获取到这个错误对象的
stack
属性,从而获取到被调用函数所在的文件名和行数。示例代码如下:
function getLineInfo() {
const err = new Error();
const stack = err.stack.split('\n');
const line = stack[2];
const fileInfo = line.trim().match(/at (.*) \((.*):(\d+):(\d+)\)/);
return fileInfo[2] + ":" + fileInfo[3] + "," + fileInfo[1];
}
console.log(getLineInfo()); // 输出:nodejs.js:6,getLineInfo
在上面的示例代码中,我们手动抛出了一个错误,然后将错误对象的stack
属性按换行符分隔后,取其中的第三行,也就是调用当前函数的那一行,然后通过正则表达式,从中提取出文件名和行数,最后将它们拼接起来返回。
- 除了手动抛出错误,我们还可以利用函数自带的
arguments.callee
属性获取到调用当前函数的函数对象,然后再利用这个函数对象的toString()
方法,获取到函数的源代码,从而获取到文件名和行数。示例代码如下:
function getLineInfo2() {
const caller = getLineInfo2.caller;
const fnStr = caller.toString();
const line = fnStr.split('\n')[1];
const fileInfo = line.trim().match(/at (.*) \((.*):(\d+):(\d+)\)/);
return fileInfo[2] + ":" + fileInfo[3] + "," + fileInfo[1];
}
console.log(getLineInfo2()); // 输出:nodejs.js:22,getLineInfo2
在上面的示例代码中,我们利用了arguments.callee
属性,获取到调用当前函数的函数对象caller
,然后通过调用toString()
方法,获取到函数对象的源代码,从中提取出调用函数的那一行,再通过正则表达式从中提取出文件名和行数。
到这里,我们就成功地获取了当前函数被调用的行数及文件名。注意,这个功能在生产环境中并不推荐使用,因为手动抛出错误会损失一定的性能,而且获取到的文件名和行数可能会受到堆栈深度、代码压缩等因素的影响,因此只适用于开发和调试阶段。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs中获取当前函数被调用的行数及文件名详解 - Python技术站