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

nodejs的调试debug

时间:2023-04-03 16:38:07 Node.js

简介对于开发者来说,在开发应用的过程中,为了方便开发和解决bug,往往需要借助编程语言的调试功能。一般来说,我们需要借助强大的IDE的调试功能来完成这项工作。nodejs也不例外。今天我们将详细介绍如何调试nodejs程序。开启nodejs调试还记得我们之前讲过的koa程序吗?本文将以一个简单的koa服务器程序为例,开始调试nodejs。先看下一个简单的koa服务app.js:constKoa=require('koa');constapp=module.exports=newKoa();app.use(asyncfunction(ctx){ctx.body='HelloWorld';});if(!module.parent)app.listen(3000);上面的程序打开了3000端口,建立了一个http服务。每次请求都会返回helloWorld,很简单。要运行上面的程序,我们需要执行nodeapp.js。这会执行app.js但不会启用调试。如何调试呢?我们需要添加--inspect参数:node--inspectapp.js上面的代码会开启nodejs的调试功能。让我们看一下输出:Debuggerlisteningonws://127.0.0.1:9229/88c23ae3-9081-41cd-98b0-d0f7ebceab5a如需帮助,请参阅:https://nodejs.org/en/docs/inspector结果告诉我们两个首先是调试器侦听的端口。默认会打开127.0.0.1的9229端口。并分配一个唯一的UUID以示区别。第二件事就是告诉我们nodejs使用的调试器是Inspector。Inspector是在nodejs8之后引入的,如果是在nodejs7之前,那么就是使用legacydebugger。调试安全如果调试器接入nodejs运行环境,如果有恶意攻击者,恶意攻击者可以在nodejs环境中运行任意代码。这会给我们的程序带来很大的安全隐患。所以一定要注意调试的安全性。一般来说,我们不推荐远程调试。默认--inspect绑定到127.0.0.1,只允许本地程序访问。并且任何在本地运行的程序都有调试该程序的权限。如果我们真的想把调试程序暴露给外部程序,那么我们可以指定本机的外网IP地址或者0.0.0.0(意思是任意地址,无限制),这样远程机器就可以进行远程调试了。如果我们想进行安全的远程调试呢?首先,我们需要启用本地调试:node--inspectapp.js然后我们可以建立一个ssh隧道并将本地端口9221映射到远程服务器的端口9229:ssh-L9221:localhost:9229user@remote.example.com这样我们就可以通过连接本地9221端口进行远程调试。使用WebStorm进行nodejs调试JetBrains出品的WebStorm可谓是开发nodejs的利器。WebStorm带有一个调试选项。如果开启这个选项,会在后台开启--inspect:使用WebStorm进行调试和IDEA进行java程序调试类似,这里不多做介绍。使用ChromedevTools调试使用ChromedevTools调试的先决条件是我们启用了--inspect模式。在chrome中输入chrome://inspect:我们可以看到chromeinspect的界面。如果你本地已经有一个启用了inspect的nodejs程序,你可以直接在RemoteTarget中看到它。选择你要调试的目标,点击inspect打开ChromedevTools调试工具:你可以分析程序或调试它。这里我们着重调试,所以到源码栏,添加你要调试的程序的源码:添加断点开始调试。和在chrome中调试web端js是一样的。使用node-inspect调试其实nodejs有一个内置的调试工具叫node-inspect,它是一个cli调试工具。让我们看看如何使用它。我们直接使用:nodeinspectapp.js1constKoa=require('koa');2constapp=module.exports=newKoa();3debug>nodeinspect做了两件事,第一件事是生成一个子程序来运行node--inspectapp.js,第二件事是在主程序中运行CLI调试窗口。这个CLI调试器为我们提供了一些非常有用的命令:Steppingcont,c:下一步继续执行,n:步进下一步,s:步进out,o:步进暂停:暂停运行代码BreakpointssetBreakpoint(),sb():设置一个当前行断点setBreakpoint(line),sb(line):在指定行设置断点setBreakpoint('fn()'),sb(...):在指定函数设置断点setBreakpoint('script.js',1),sb(...):在指定的脚本文件中设置断点clearBreakpoint('script.js',1),cb(...):从文件中清除断点Informationbacktrace,bt:print当前执行帧的回溯信息list(5):列出源代码前后5行watch(expr):添加watch表达式unwatch(expr):删除watch表达式watchers:列出所有watchersrepl:打开repl表达式execexpr:执行表达式通过上面的命令,我们可以在CLI中进行更复杂的调试活动。除了上面提到的其他调试客户端,我们还可以使用vscode、VisualStudio、EclipseIDE等调试nodejs,这里不再详细介绍。感兴趣的朋友可以自行探索。本文作者:flydean程序那些事儿本文链接:http://www.flydean.com/nodejs-debug/本文出处:flydean的博客欢迎关注我的公众号:最通俗的“程序东西”解读,最深刻的干货,最简洁的教程,还有很多你不知道的小技巧等你来发现!