Node.js系列文章:如何进行代码调试
使用任何一门编程语言,都少不了代码调试这一功能。我们在使用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系列文章:如何进行代码调试的更多相关文章
- Node.js系列文章:编写自己的命令行界面程序(CLI)
CLI的全称是Command-line Interface(命令行界面),即在命令行接受用户的键盘输入并作出响应和执行的程序. 在Node.js中,全局安装的包一般都具有命令行界面的功能,例如我们用于 ...
- Node.js系列文章:利用console输出日志文件
通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单 ...
- 微信JS图片上传与下载功能--微信JS系列文章(三)
概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...
- 微信JS分享功能--微信JS系列文章(二)
概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...
- Ember.js系列文章
JS前端框架之Ember.js系列文章 本文为文章索引,主要是罗列Ember.js的相关文章便于阅读. 相关演示代码:github for free. 基础篇 1. EmberJs之What|Why| ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- Node.js系列-express(上)
前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...
- Node.js系列——(4)优势及场景
背景 之前几篇系列文章简单介绍了node.js的安装配置及基本操作: Node.js系列--(1)安装配置与基本使用 Node.js系列--(2)发起get/post请求 Node.js系列--(3) ...
- TraceGL监控Node.js应用或者浏览器JavaScript代码
https://github.com/traceglMPL/tracegl TraceGL能够监控Node.js应用或者浏览器JavaScript代码的运行过程和细节.可视化的用户界面也很友好
随机推荐
- 【Linux】 用户管理
Linux用户管理 ■ 查看用户整体情况 cat /etc/passwd可以查看用户的一些基本信息.用finger <user>似乎更加方便 查看某一个特定的用户的话就可以 grep &l ...
- Java中如何创建线程
Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...
- 02-Python的下载和安装_Python编程之路
原文发布在特克斯博客www.susmote.com 之前给大家讲了关于python的背景知识,还有Python的优点和缺点,相信通过之前的介绍很多人已经清楚自己到底要不要选择学习Python,如果已经 ...
- linux下tomcat无法访问问题(换一种说法:无法访问8080端口)
有时候linux下的tomcat其他机器无法访问,比如主机无法访问linux虚拟机的tomcat,这是因为tocat的端口,linux没有对外开放,所以只能localhost访问,但是别的机器访问不了 ...
- JavaScript(第三十天)【XPath】
XPath是一种节点查找手段,对比之前使用标准DOM去查找XML中的节点方式,大大降低了查找难度,方便开发者使用.但是,DOM3级以前的标准并没有就XPath做出规范:直到DOM3在首次推荐到标准规范 ...
- 从PRISM开始学WPF
我最近打算学习WPF ,在寻找MVVM框架的时候发现了PRISM,在此之前还从一些博客上了解了其他的MVVM框架,比如浅谈WPF中的MVVM框架--MVVMFoundation 中提到的MVVMFou ...
- 项目Alpha冲刺Day6
一.会议照片 二.项目进展 1.今日安排 熟悉后台框架并编写.继续搭建前台框架模版.熟悉前端框架开发流程.完成前端热部署配置.完成部分后台用户信息相关接口.解决后台jdk1.8日期在框架中的使用. 2 ...
- 201621123040《Java程序设计》第3周学习总结
1.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 面向对象的思想 对象 类 1.2 用思维导图或者Onenote或其他工具将这些关键词组织起来. 掌握的还不够深 ...
- python3爬虫之入门和正则表达式
前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享:爬虫说的简单,就是去抓取网路的数据进行分析处理:这章主要入门,了解几个爬虫的小测 ...
- 201421123042 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 Comparable Arrays.sort -has a Lambda表达式 1.2尝试使用思维导图将这些关键词组织起来 ...