Node.js系列文章:如何进行代码调试

时间:2022-02-26 13:22:06

使用任何一门编程语言,都少不了代码调试这一功能。我们在使用JavaScript编写浏览器端代码时,Chrome提供了强大的调试工具Dev Tools,但是在编写Node.js代码时,大多数人最开始都使用console.log来进行跟踪调试,开发过程因此变得相当繁琐。其实Node.js也提供了一些内置的调试功能,使用这些调试功能可以大大提高开发速度,今天就来简单介绍一下如何在Node.js环境使用debug功能。

首先,我们创建一个debug目录,在这个目录内再创建一个index.js文件,如图所示:

Node.js系列文章:如何进行代码调试

源代码文件index.js内容如下:

global.x = 5;

function fn() {
    console.log('calling fn');
}

setTimeout(() => {

    console.log('world');

    debugger;

    fn();

}, 1000);

console.log('hello');

命令行调试界面

在使用`node`命令执行该文件时,加上一个`inspect`参数,即可进入命令行调试界面:

Node.js系列文章:如何进行代码调试

上图中是经过预处理后的代码,可以看到,我们的源代码被外层函数包裹起来了,该函数的参数分别是`exports`、`require`、`module`、`__filename`、`__dirname`,这也是我们可以直接在Node.js源代码中直接使用的原因。

在上图的界面中,我们可以执行如下命令,来完成调试的控制流程:

next 执行下一步 简写形式:n
cont 继续执行,直到下一个断点 简写形式:c
step 进入函数内部 简写形式:s
out 跳出当前执行函数 简写形式:o

list(n) 显示前后个n行的调试界面

watch(expr) 添加一个表达式到监测列表
watchers 列出监测列表中所有的表达式
unwatch(expr) 从监测列表移除指定的表达式

exec expr 执行指定的表达式

backtrace 打印出当前代码的执行栈信息 简写形式:bt

.exit 退出调试界面

图形化调试界面

图形化调试界面是利用Chrome的Dev Tools来完成的,只需在执行程序时稍微改变一下命令行参数即可。对于普通的Node.js程序,需要使用`--inspect-brk`命令行参数,该参数会在程序的第一行设置断点,如下图所示:

Node.js系列文章:如何进行代码调试

然后在Chrome当前Tab页打开Dev Tools:

Node.js系列文章:如何进行代码调试

然后点击左上角绿色的Node.js图表,进入调试界面,调试方法和浏览器端代码一致,如下图所示:

Node.js系列文章:如何进行代码调试

调试过程中,Dev Tools和命令行会同步输出结果:

Node.js系列文章:如何进行代码调试

如果我们的程序是一个Web服务程序,开发人员想要调试用户的请求处理流程,那么命令行参数会稍微有所不同,只需指定`--inspect`即可,我们先添加一个server.js文件,内容如下:

let http = require('http');

let hostname = '127.0.0.1';
let port = 3000;

let reqTimes = 0;

let server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end(`reuqest times: ${++reqTimes}`);
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

然后使用下面命令启动:

Node.js系列文章:如何进行代码调试

最后,我们就可以在Dev Tools中打开调试界面并手动设置断点了:

Node.js系列文章:如何进行代码调试

参考资料:

https://nodejs.org/api/debugger.html