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

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

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

global.x = 5;

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

setTimeout(() => {

    console.log('world');

    debugger;

    fn();

}, 1000);

console.log('hello');

命令行调试界面

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

上图中是经过预处理后的代码,可以看到,我们的源代码被外层函数包裹起来了,该函数的参数分别是`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`命令行参数,该参数会在程序的第一行设置断点,如下图所示:

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

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

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

如果我们的程序是一个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}/`);
});

然后使用下面命令启动:

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

参考资料:

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

Node.js系列文章:如何进行代码调试的更多相关文章

  1. Node.js系列文章:编写自己的命令行界面程序(CLI)

    CLI的全称是Command-line Interface(命令行界面),即在命令行接受用户的键盘输入并作出响应和执行的程序. 在Node.js中,全局安装的包一般都具有命令行界面的功能,例如我们用于 ...

  2. Node.js系列文章:利用console输出日志文件

    通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单 ...

  3. 微信JS图片上传与下载功能--微信JS系列文章(三)

    概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...

  4. 微信JS分享功能--微信JS系列文章(二)

    概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...

  5. Ember.js系列文章

    JS前端框架之Ember.js系列文章 本文为文章索引,主要是罗列Ember.js的相关文章便于阅读. 相关演示代码:github for free. 基础篇 1. EmberJs之What|Why| ...

  6. node.js系列笔记之node.js初识《一》

    node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...

  7. Node.js系列-express(上)

    前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...

  8. Node.js系列——(4)优势及场景

    背景 之前几篇系列文章简单介绍了node.js的安装配置及基本操作: Node.js系列--(1)安装配置与基本使用 Node.js系列--(2)发起get/post请求 Node.js系列--(3) ...

  9. TraceGL监控Node.js应用或者浏览器JavaScript代码

    https://github.com/traceglMPL/tracegl TraceGL能够监控Node.js应用或者浏览器JavaScript代码的运行过程和细节.可视化的用户界面也很友好

随机推荐

  1. Jenkins集成Docker镜像实现自动发布

    1. 思路&流程 Jenkins集成Docker镜像实现自动发布与Jenkins发布mavne项目思路一样总体流程 为:Jenkins 拉去远端源码 -- gitl实现应用打包 -- jenk ...

  2. 由浅入深理解----java反射技术

    java反射机制详解 java反射机制是在运行状态下,对任意一个类可以获取该类的属性和方法,对任意一个对象可以调用其属性和方法.这种动态的获取信息和调用对象的方法的功能称为java的反射机制 clas ...

  3. Ubuntu16.0.4的磁盘管理

    ubuntu下硬盘无损分区移动修改工具 原创 2014年04月13日 :: ubuntu上面其实有很好的分区调整工具,gparted,非常好使用 安装非常简单 sudo apt-get install ...

  4. KS检验统计量的扩展应用(CMap)

    KS检验统计量的扩展应用 KS(Kolmogorov-Smirnov)检验是比较两个经验分布之间是否存在差异. 我们设X1, X2,-, Xm, Y1, Y2,-, Ym为两个独立随机样本,分别满足假 ...

  5. JaveScript对象(JS知识点归纳七)

    1.JS中的对象表示的是一个具体的事物. a)静态的特征=>对象的属性 b)动态的行为=>对象的方法=>保存的值==>函数 2.对象的创建方式 a)构造函数的创建方式 ``` ...

  6. 201621123062《java程序设计》第六周作业总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  7. 小草手把手教你 LabVIEW 串口仪器控制——初识VISA串口

    有些人,学习一样东西时候,喜欢现成的例子.很多人学习一门技术,都喜欢现成的例子开始,比如学单片机的啊,最开始都是修改的例子吧,学语言的也是.最开始都是模仿.这个年头看书上的理论知识太浪费时间了.所以啊 ...

  8. Mysql 相关操作

    1.用户管理 创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename us ...

  9. Excel+DDT数据驱动实例

    一.首先安装dtt模块 数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt.data() 4.运行后用例会自动加载成N个单独的用例 二 ...

  10. 第三章 jQuery中的事件与动画

    第三章jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.wind ...