浅谈Node 调试工具入门教程


Posted in Javascript onMarch 20, 2018

JavaScript 程序越来越复杂,调试工具的重要性日益凸显。客户端脚本有浏览器,Node 脚本怎么调试呢?

浅谈Node 调试工具入门教程

2016年,Node 决定将 Chrome 浏览器的"开发者工具"作为官方的调试工具,使得 Node 脚本也可以使用图形界面调试,这大大方便了开发者。

本文介绍如何使用 Node 脚本的调试工具。

一、示例程序

为了方便讲解,下面是一个示例脚本。首先,新建一个工作目录,并进入该目录。

$ mkdir debug-demo
$ cd debug-demo

然后,生成 package.json 文件,并安装Koa 框架和 koa-route 模块。

$ npm init -y
$ npm install --save koa koa-route

接着,新建一个脚本 app.js ,并写入下面的内容。

// app.js
const Koa = require('koa');
const router = require('koa-route');

const app = new Koa();

const main = ctx => {
 ctx.response.body = 'Hello World';
};

const welcome = (ctx, name) => {
 ctx.response.body = 'Hello ' + name;
};

app.use(router.get('/', main));
app.use(router.get('/:name', welcome));

app.listen(3000);
console.log('listening on port 3000');

上面代码是一个简单的 Web 应用,指定了两个路由,访问后会显示一行欢迎信息。如果想详细了解代码的详细含义,可以参考Koa 教程。

二、启动开发者工具

现在,运行上面的脚本。

$ node --inspect app.js

上面代码中, --inspect 参数是启动调试模式必需的。这时,打开浏览器访问 http://127.0.0.1//3000,就可以看到 Hello World 了。

浅谈Node 调试工具入门教程

接下来,就要开始调试了。一共有两种打开调试工具的方法,第一种是在 Chrome 浏览器的地址栏,键入 chrome://inspect 或者 about:inspect ,回车后就可以看到下面的界面。

浅谈Node 调试工具入门教程

在 Target 部分,点击 inspect 链接,就能进入调试工具了。

第二种进入调试工具的方法,是在 http://127.0.0.1//3000 的窗口打开"开发者工具",顶部左上角有一个 Node 的绿色标志,点击就可以进入。

浅谈Node 调试工具入门教程

三、调试工具窗口

调试工具其实就是"开发者工具"的定制版,省去了那些对服务器脚本没用的部分。

它主要有四个面板。

  1. Console:控制台
  2. Memory:内存
  3. Profiler:性能
  4. Sources:源码

浅谈Node 调试工具入门教程

这些面板的用法,基本上跟浏览器环境差不多,这里只介绍 Sources (源码)面板。

四、设置断点

进入 Sources 面板,找到正在运行的脚本 app.js

浅谈Node 调试工具入门教程

在第11行(也就是下面这一行)的行号上点一下,就设置了一个断点。

ctx.response.body = 'Hello ' + name;

浅谈Node 调试工具入门教程

这时,浏览器访问 http://127.0.0.1:3000/alice ,页面会显示正在等待服务器返回。切换到调试工具,可以看到 Node 主线程处于暂停(paused)阶段。

浅谈Node 调试工具入门教程

进入 Console 面板,输入 name,会返回 alice。这表明我们正处在断点处的上下文(context)。

浅谈Node 调试工具入门教程

再切回 Sources 面板,右侧可以看到 Watch、Call Stack、Scope、Breakpoints 等折叠项。打开 Scope 折叠项,可以看到 Local 作用域和 Global 作用域里面的所有变量。

Local 作用域里面,变量 name 的值是 alice ,双击进入编辑状态,把它改成 bob

浅谈Node 调试工具入门教程

然后,点击顶部工具栏的继续运行按钮。

浅谈Node 调试工具入门教程

页面上就可以看到 Hello bob 了。

浅谈Node 调试工具入门教程

命令行下,按下 ctrl + c,终止运行 app.js

五、调试非服务脚本

Web 服务脚本会一直在后台运行,但是大部分脚本只是处理某个任务,运行完就会终止。这时,你可能根本没有时间打开调试工具。等你打开了,脚本早就结束运行了。这时怎么调试呢?

$ node --inspect=9229 -e "setTimeout(function() { console.log('yes'); }, 30000)"

上面代码中, --inspect=9229 指定调试端口为 9229,这是调试工具默认的通信端口。 -e 参数指定一个字符串,作为代码运行。

访问 chrome://inspect ,就可以进入调试工具,调试这段代码了。

浅谈Node 调试工具入门教程

代码放在 setTimeout 里面,总是不太方便。那些运行时间较短的脚本,可能根本来不及打开调试工具。这时就要使用下面的方法。

$ node --inspect-brk=9229 app.js

上面代码中, --inspect-brk 指定在第一行就设置断点。也就是说,一开始运行,就是暂停的状态。

六、忘了写 --inspect 怎么办?

打开调试工具的前提是,启动 Node 脚本时就加上 --inspect 参数。如果忘了这个参数,还能不能调试呢?

回答是可以的。首先,正常启动脚本。

$ node app.js

然后,在另一个命令行窗口,查找上面脚本的进程号。

$ ps ax | grep app.js 

30464 pts/11  Sl+  0:00 node app.js
30541 pts/12  S+   0:00 grep app.js

上面命令中, app.js 的进程号是 30464

接着,运行下面的命令。

$ node -e 'process._debugProcess(30464)'

上面命令会建立进程 30464 与调试工具的连接,然后就可以打开调试工具了。

还有一种方法,就是向脚本进程发送 SIGUSR1 信号,也可以建立调试连接。

$ kill -SIGUSR1 30464

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 非图片动态loading效果实现代码
Apr 09 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
May 23 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
Mar 03 Javascript
Angular Js文件上传之form-data
Aug 28 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
AngularJS表单提交实例详解
Feb 18 Javascript
Angular4编程之表单响应功能示例
Dec 13 Javascript
webpack打包非模块化js的方法
Oct 24 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 Javascript
js中offset,client , scroll 三大元素知识点总结
Sep 11 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
Mar 20 #Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
Mar 20 #jQuery
关于vue面试题汇总
Mar 20 #Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
Mar 20 #Javascript
快速解决vue-cli不能初始化webpack模板的问题
Mar 20 #Javascript
解决vue-cli + webpack 新建项目出错的问题
Mar 20 #Javascript
p5.js入门教程之图片加载
Mar 20 #Javascript
You might like
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python实现截屏的函数
2015/07/26 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
费用会计岗位职责
2014/01/01 职场文书
森林防火工作方案
2014/02/14 职场文书
建筑管理专业求职信
2014/07/28 职场文书
校庆团日活动总结
2014/08/28 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
辞职信标准格式
2015/02/27 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS