在 Node.js 的开发过程中,经常需要对代码进行调试和排查错误。其中调用栈信息是非常重要的一部分,可以帮助我们更好地理解代码的执行过程以及找出错误所在。而 npm 包 callsite-record 就是一个方便获取调用栈信息的工具。
安装
使用 npm 安装 callsite-record:
npm install callsite-record
使用方法
获取当前调用栈
可以通过调用 callsiteRecord.capture()
方法来获取当前的调用栈:
const callsiteRecord = require('callsite-record') const stack = callsiteRecord.capture() console.log(stack)
输出结果类似于:
-- -------------------- ---- ------- - - ---------------- ---------- ----------------- -------------- ---------- --------------- ------------ ---------- ------------- ------------ ---------- ------------- -------------- ---------- --------------- -------------- ---------- --------------- ------------ ---------- ------------- -------------- ---------- --------------- ------- ---------- -------- --------- ---------- ---------- ----------- ---------- ----------- -- - -- --- - -
获取指定深度的调用栈
可以传入一个参数来指定需要获取的调用栈深度:
const callsiteRecord = require('callsite-record') const stack = callsiteRecord.capture(1) // 获取调用 capture 方法的调用栈 console.log(stack)
解析调用栈信息
对于每个调用栈的元素,可以获取以下信息:
getFileName()
:该函数所在文件的绝对路径。getLineNumber()
:该函数在文件中的行数。getColumnNumber()
:该函数在文件中的列数。getTypeName()
:如果该函数是对象的方法,返回该对象的类型名称;否则返回 undefined。getFunction()
:返回该调用栈元素对应的函数。getMethodName()
:如果该函数是对象的方法,返回该方法名;否则返回该函数名。isConstructor()
:如果该函数是构造函数,返回 true;否则返回 false。isEval()
:如果该函数是在 eval 中创建的,返回 true;否则返回 false。isNative()
:如果该函数是内置函数,返回 true;否则返回 false。isToplevel()
:如果该函数是全局作用域中定义的,返回 true;否则返回 false。
例如,我们可以使用以下代码将调用栈信息解析成字符串形式并输出:
const callsiteRecord = require('callsite-record') const stack = callsiteRecord.capture() console.log(stack.map((frame) => { return `${frame.getFileName()}:${frame.getLineNumber()}` }).join('\n'))
格式化调用栈信息
使用 callsiteRecord.render(stack)
方法可以将调用栈信息格式化成易读的字符串:
const callsiteRecord = require('callsite-record') const stack = callsiteRecord.capture() console.log(callsiteRecord.render(stack))
输出结果类似于:
Error: test at Object.<anonymous> (/path/to/test.js:2:15) at Module._compile (internal/modules/cjs/loader.js:999:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) at Module.load (internal/modules/cjs/loader.js:863:32) at Function.Module._load (internal/modules/cjs/loader.js:708:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) at internal/main/run_main_module.js:17:47
获取调用栈信息的上下文
使用 callsiteRecord.getCallerSourceLines(stack, [options])
方法可以获取调用栈信息所在文件中指定行数的代码。例如,以下代码可以打印出调用 foo()
函数时的代码片段:
const callsiteRecord = require('callsite-record') function foo > 来源:[JavaScript中文网](https://www.javascriptcn.com/post/44538) ,转载请注明来源 [https://www.javascriptcn.com/post/44538](https://www.javascriptcn.com/post/44538)