对于绝大部分前端人员,对JavaScript
的调试更多停留在浏览器中,相似console.log
和debugger
,但这种方式对代码侵入性较高,甚至须要刷新页面或重启编译器。转向服务端后,没有浏览器界面,若是仅停留在原来的调试方式,开发效率想必是较低的。所以,前端人员转向服务端开发时,要习惯于命令行及 IDE 等调试手段,走出温馨区,才能准肯定位问题,提升开发效率。javascript
下文中涉及到的依赖库及软件版本
如下代码段为例,用koa
起一个简单的http server
const Koa = require('koa'); const app = new Koa(); app.use(async ctx => { const time = new Date(); ctx.body = `hello, hiker! ${time}`; }); app.listen(3000, () => { console.log('nodejs listening 3000.'); });
对前端人员很是友好,与浏览器中调试同样,console.log()
、console.error()
、console.time()
等各类console
形式,在代码中须要调试的地方直接写上,只是展现形式有所不一样,在Node.js
中是在终端命令行中打印。这是最简单快速的调试手段,缺点也很明显,对原有代码入侵较大,在特定场景中使用较局限。html
app.use(async ctx => { const time = new Date(); console.time('TIME_TAKE'); console.log('this is time', time); ctx.body = `hello, hiker! ${time}`; console.timeEnd('TIME_TAKE'); }); app.listen(3000, () => { console.log('nodejs listening 3000.'); });
终端起服务:node index.js
,并浏览器访问localhost:3000
, 便可在终端命令行中看到相应打印的日志。
Nodejs v6.3+
的版本提供了两个用于调试的协议:v8 Debugger Protocol
和v8 Inspector Protocol
可使用第三方的 Client/IDE 等监测和介入 Node(v8) 运行过程,进行调试。
node-inspector是早期能够基于Chrome,有可视化调试界面的调试工具,用的是v8 Debugger Protocol
协议,经过 TCP 端口与 Client/IDE 交互通讯。但因为v8 Inspector Protocol
的推出,这个工具逐渐被替代,后文会介绍相应替代方案。前端
$ npm install -g node-inspector 经过浏览器链接到node-inspector,启动inspector服务: $ node-inspector 以debug模式运行node.js应用: $ node --debug=5858 index.js 浏览器打开 http://127.0.0.1:8080/debug?port=5858,后台会提供一个相似于 chrome devtools 的 UI 调试界面。
v8 Inspector Protocol
是nodejs v6.3
新加入的调试协议,经过websocket
与 Client/IDE 交互,同时基于 Chrome/Chromium 浏览器的 devtools 提供了图形化的调试界面。
$ node --inspect=9222 index.js
若是程序执行完会直接结束进程的,那么--inspect
会一闪而过,断点信号还没发送出去前就结束了,断点根本不起做用,这种状况能够用--inspect-brk
启动调试器,使得脚本能够代码执行以前break
。
ws://127.0.0.1:9222/a45dc332-2c8c-4614-bf01-1dbf212ae28a
这个不是提供给咱们在Chrome浏览器中访问的地址,而是Node.js和Chrome之间进行通讯的的地址,经过websocket进行通讯,从而将调试结果实时展现在Chrome浏览器中。java
那么如何获取在chrome浏览器中的调试地址?咱们能够访问http://localhost:9222/json/list
,能够看到相应信息。其中id为UUID,是一个特定的标识,每个进程都会分配一个uuid,所以每一次调用会有出现不一样的结果。devtoolsFrontendUrl
则为咱们要访问的chrome地址,新窗口打开这个地址便可调试。node
上述步骤是否是有点麻烦,没关系,强大的Chrome提供了更方便的调试入口。
node --inspect=9222 index.js
起服务后,打开浏览器访问http监听端口页面,并打开调试窗口,能够看到一个绿色的按钮,点开便可下断点调试,是否是很方便?git
这个绿油油的按钮究竟打开了什么呢?咱们能够继续看。访问chrome://inspect/#devices
,能够看到当前浏览器监听的全部inspect
到这里,咱们就能够利用Chrome DevTools的各种功能,Sources Panel
查看脚本、Profile Panel
监测性能等,文中不具体展开。github
对服务端开发来说,浏览器的使用反而不那么频繁,所以在IDE中调试Nodejs
显得格外重要。值得高兴的是,市面上各种IDE对Nodejs
的调试还算友好,尤为是VS Code。它内置了Node debugger
,支持v8 Debugger Protocol
和v8 Inspector Protocol
两种协议。
在VS Code中,打开调试
/添加配置
/,以下图,添加launch配置,点击开始调试便可。web
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "program": "${workspaceFolder}\\index.js" } ] }
下图展现了调试窗口,能够看到,咱们能够直接在IDE中下断点,左侧小窗口中能够看到当前做用域的变量(可展开树),调用堆栈,全部断点等,右上方亦可逐步调试函数、重启等功能,很是强大。chrome
一样VS Code提供了自动附加的功能:Auto Attach。不用配置便可快速调试。
Ctrl+Shift+p
打开Auto Attach功能,而后一样的方式在终端命令行中:node --inspect=9222 .\index.js
npm
本文总结了Nodejs
的调试方法,基本涵盖了全部的调试手段,包括了命令行调试,Chrome浏览器调试,VS Code编辑器调试,并深刻部分调试协议,图文结合,可供其余的Nodejs
开发者参考,下降开发人员的学习成本,在项目工程应用中,准肯定位问题,提升开发效率。
http://nodejs.cn/api/inspector.html