在 Node.js 的开发过程中,经常需要对代码进行调试和排查错误。其中调用栈信息是非常重要的一部分,可以帮助我们更好地理解代码的执行过程以及找出错误所在。而 npm 包 callsite-record 就是一个方便获取调用栈信息的工具。
安装
使用 npm 安装 callsite-record:
--- ------- ---------------
使用方法
获取当前调用栈
可以通过调用 callsiteRecord.capture()
方法来获取当前的调用栈:
----- -------------- - -------------------------- ----- ----- - ------------------------ ------------------
输出结果类似于:
- - ---------------- ---------- ----------------- -------------- ---------- --------------- ------------ ---------- ------------- ------------ ---------- ------------- -------------- ---------- --------------- -------------- ---------- --------------- ------------ ---------- ------------- -------------- ---------- --------------- ------- ---------- -------- --------- ---------- ---------- ----------- ---------- ----------- -- - -- --- - -
获取指定深度的调用栈
可以传入一个参数来指定需要获取的调用栈深度:
----- -------------- - -------------------------- ----- ----- - ------------------------- -- ---- ------- ------ ------------------
解析调用栈信息
对于每个调用栈的元素,可以获取以下信息:
getFileName()
:该函数所在文件的绝对路径。getLineNumber()
:该函数在文件中的行数。getColumnNumber()
:该函数在文件中的列数。getTypeName()
:如果该函数是对象的方法,返回该对象的类型名称;否则返回 undefined。getFunction()
:返回该调用栈元素对应的函数。getMethodName()
:如果该函数是对象的方法,返回该方法名;否则返回该函数名。isConstructor()
:如果该函数是构造函数,返回 true;否则返回 false。isEval()
:如果该函数是在 eval 中创建的,返回 true;否则返回 false。isNative()
:如果该函数是内置函数,返回 true;否则返回 false。isToplevel()
:如果该函数是全局作用域中定义的,返回 true;否则返回 false。
例如,我们可以使用以下代码将调用栈信息解析成字符串形式并输出:
----- -------------- - -------------------------- ----- ----- - ------------------------ ----------------------------- -- - ------ ------------------------------------------------- --------------
格式化调用栈信息
使用 callsiteRecord.render(stack)
方法可以将调用栈信息格式化成易读的字符串:
----- -------------- - -------------------------- ----- ----- - ------------------------ -----------------------------------------
输出结果类似于:
------ ---- -- ------------------ ----------------------- -- --------------- --------------------------------------- -- ----------------------------- ---------------------------------------- -- ----------- --------------------------------------- -- --------------------- --------------------------------------- -- ------------------------------ --- -------- ------------------------------------ -- --------------------------------------
获取调用栈信息的上下文
使用 callsiteRecord.getCallerSourceLines(stack, [options])
方法可以获取调用栈信息所在文件中指定行数的代码。例如,以下代码可以打印出调用 foo()
函数时的代码片段:
----- -------------- - -------------------------- -------- --- ----------------------------------------------------------- ---------- ---------------------------------------------------------------------------------------