当前位置: 首页 > 后端技术 > Node.js

Nodejs调试的各种姿势

时间:2023-04-04 00:28:27 Node.js

Node.js调试的痛点对于大多数前端人员来说,JavaScript的调试更多的停留在浏览器中,类似于console.log和debugger,但是这种方式对代码的侵入性较低,甚至需要刷新页面或者重启编译器。切换到服务器端后,没有浏览器界面。如果只停留在原来的调试模式,开发效率肯定很低。因此,当前端人员转向服务端开发时,必须习惯命令行、IDE等调试方式,走出舒适区才能准确定位问题,提高开发效率。Node.js调试方式下面涉及到的依赖库和软件版本分别是Node.js-v10.15.3Chrome-v72.0.3626VSCode-v1.13.0以下代码片段为例,启动一个简单的httpserverconstKoa=要求('koa');constapp=newKoa();应用程序。use(asyncctx=>{consttime=newDate();ctx.body=`你好,徒步旅行者!${time}`;});app.listen(3000,()=>{console.log('nodejs监听3000.');});1、console.log()对前端人员非常友好,就像在浏览器中调试一样,console.log()、console.error()、console.time()等控制台形式直接写在地方其中代码中需要调试,但显示形式不同。在Node.js中,它打印在终端命令行上。这是最简单、最快的调试方法,但它的缺点也很明显。侵入原代码,仅限于特定场景。示例app.use(asyncctx=>{consttime=newDate();console.time('TIME_TAKE');console.log('thisistime',time);ctx.body=`你好,徒步旅行者!${time}`;console.timeEnd('TIME_TAKE');});app.listen(3000,()=>{console.log('nodejslistening3000.');});结果终端服务:nodeindex.js,用浏览器访问localhost:3000,可以在终端命令行看到相应的打印日志。2.DebuggerProtocol(node-inspector)Nodejsv6.3+版本提供了两种调试协议:v8DebuggerProtocol和v8InspectorProtocol可以使用第三方Client/IDE来监控和干预Node(v8)运行进程进行调试。node-inspector是早期基于Chrome的调试工具,具有可视化调试界面。它使用v8调试器协议并通过TCP端口与客户端/IDE通信。不过由于v8InspectorProtocol的推出,这个工具已经逐渐被替代,后面会介绍相应的替代品。用法$npminstall-gnode-inspector通过浏览器连接到node-inspector,启动inspector服务:$node-inspector在调试模式下运行node.js应用程序:$node--debug=5858index.jsbrowseropenhttp://127.0.0.1:8080/debug?port=5858,后台会提供类似chromedevtools的UI调试界面。3.InspectorProtocol+ChromeDevToolsv8InspectorProtocol是nodejsv6.3新增的调试协议。它通过websocket与Client/IDE交互,提供基于Chrome/Chromium浏览器devtools的图形化调试界面。$node--inspect=9222index.js如果程序执行完会直接结束进程,那么--inspect会一闪而过,断点信号还没发送就结束,断点根本不起作用。在这种情况下,您可以使用--inspect-brk启动调试器,以便脚本可以在代码执行之前中断。结果ws://127.0.0.1:9222/a45dc332-2c8c-4614-bf01-1dbf212ae28a并不是Chrome浏览器中提供给我们的地址,而是Node.js与Chrome通信的地址,通过websocket进行通信,以便在Chrome浏览器中实时显示调试结果。那么如何在chrome浏览器中获取调试地址呢?我们可以访问http://localhost:9222/json/list,查看相应的信息。其中id为UUID,是一个具体的标识。每个进程都会分配一个uuid,所以每次调用都会有不同的结果。devtoolsFrontendUrl就是我们要访问的chrome地址,在新窗口打开这个地址进行调试。更方便的调试入口上面的步骤有点麻烦,没关系,强大的Chrome提供了更方便的调试入口。node--inspect=9222index.js启动服务后,打开浏览器访问http监听端口页面,打开调试窗口,可以看到一个绿色的按钮,点击它进行断点调试,是不是很方便的?这个绿色按钮究竟打开了什么?我们可以继续关注。访问chrome://inspect/#devices,可以在这里看到当前浏览器监控的所有inspector,我们可以使用ChromeDevTools的各种功能,SourcesPanel查看脚本,ProfilePanel监控性能等,这里不会在文章中详细说明。4.InspectorProtocol+VSCode对于服务端开发,浏览器的使用不是那么频繁,所以在IDE中调试Nodejs就显得尤为重要。好消息是市面上各种IDE对Nodejs调试都很友好,尤其是VSCode。它内置了Node调试器,支持v8DebuggerProtocol和v8InspectorProtocol。launch在VSCode中,打开Debug/AddConfiguration/,如下图,添加launch配置,点击开始调试。{“版本”:“0.2.0”,“配置”:[{“类型”:“节点”,“请求”:“启动”,“名称”:“启动程序”,“程序”:“${workspaceFolder}\\index.js"}]}下图显示了调试窗口。可以看到我们可以直接在IDE中设置断点,在左边的小窗口中可以看到当前作用域(展开树)的变量。调用栈,所有断点等,右上还可以一步步调试功能,重启等功能,很强大。AutoAttachVSCode还提供了一个自动附加功能:AutoAttach。无需配置即可快速调试。Ctrl+Shift+p打开AutoAttach功能,然后在终端命令行同样的方式:node--inspect=9222.\index.jsdrunk本文总结了Nodejs的调试方式,基本涵盖了所有的调试方式,包括命令行调试、Chrome浏览器调试、VSCode编辑器调试,以及调试协议的深入部分,图文并茂,可以作为其他Nodejs开发者的参考,降低开发者的学习成本。在项目工程应用中,准确定位问题,提高开发效率。参考资料:http://nodejs.cn/api/inspector.htmlhttp://nodejs.cn/api/debugger.htmlhttp://i5ting.github.io/vsc/#1