Node.js项目开发过程中,随着项目的发展,调用关系越来越复杂,调试工具的重要性日益凸显。
Node(v6.3+)集成了一个方便的V8 Inspect调试器,允许我们通过Chrome DevTools进行图形化调试和性能分析。同时,我们也可以使用VS Code、Webstorm等支持的编辑器来调试Node.js程序。
Node Inspect
要启动调试器,我们需要在启动Node.js应用程序时传入-inspect标志,或者我们可以使用该标志来提供一个自定义端口。例如,- inspect=9222将接受开发者的工具在9222端口上的连接。
一段简单的代码
函数log() {设a = 1;console . log(a);a = 2;console . log(a);} log();使用节点检查开始复制代码。
这个时候我们会发现程序是直接执行的,没有中断,这让我们无法用Chrome DevTools进行调试。对于这种直接执行的代码,我们可以在应用程序代码的第一行末尾使用- inspect-brk参数,然后进行调试。
Chrome DevTools
当节点调试开始后,我们可以打开Chrome,访问chrome://inspect,在Devices中找到我们的Node.js程序,点击inspect打开调试面板进行操作。
在调试工具窗口中,我们可以设置断点并运行程序进行调试。
运行中程序调试
在某些情况下,我们可能需要调试正在运行的Node.js程序,比如Express Web service。我们不能停止服务并使用- inspect运行调试。
在这种情况下,我们可以先获取服务的进程Id。
向脚本进程发送SIGUSR1信号,建立调试连接。
kill -SIGUSR1 34943复制代码使用配置调试
对于大多数调试场景,更推荐使用配置文件,因为它可以配置并保存调试设置的信息,方便我们下次快速使用。在VC代码中,调试配置通常存储在。vscode文件夹。您可以单击左栏中的调试图标来快速创建launch.json文件。
VS代码会自动调试类似下面launch.json的配置文件,其中program代表我们需要调试的文件路径,workspaceFolder是当前工作区的路径,通常是项目的根目录。
{ "版本& # 34;: "0.2.0", "配置& # 34;: [ { "类型& # 34;: "节点& # 34;, "请求& # 34;: "启动& # 34;, "姓名& # 34;: "启动程序& # 34;, "skipFiles & # 34: ["& ltnode _ internals & gt/**"], "程序& # 34;: "$ { workspace folder }/index . js & # 34;}]}可以通过复制代码设置断点来开始调试,在左边的树形视图中可以看到变量的对应值和堆栈信息。
launch.json
launch.json中有许多不同的属性,它们支持不同的调试器和调试场景。以下属性在每个启动配置中都是必需的。
name – 当前调试配置项的名称,可读性要好,区分每个调试配置项type – 用于此启动配置的调试器的类型。每个已安装的调试扩展都引入一种类型:例如node,php,go 等。request – 当前调试项的类型,目前支持 launch 和 attach 两种类型。launch 适合调试未启动的程序,attach 则适合调试已经运行的程序。
一些其他有用的选项:
program – 启动调试器时要运行的可执行程序或文件args – 传递给程序进行调试的参数env – 调试时的环境变量envFile – 包含环境变量键值对的文件stopOnEntry – 程序启动时立即中断port – 连接到正在运行的调试器的端口runtimeExecutable – 启用调试的可执行 Runtime,默认是 Node日志点 – Logpoints
VS代码提供了一个有用的调试小工具——log point,它是断点的变种,它不& # 34;中断& # 34;进入调试器,但向控制台记录一条消息。在调试无法暂停或停止的生产服务器时,日志点对于注入日志特别有用。
NPM 脚本调试
除了使用node启动Node.js项目,VS代码还支持自定义启动程序运行时。有了这个能力,你就可以直接用NPM开始调试了。使用npm启动调试,如下运行调试。
"脚本& # 34;: { "调试& # 34;: "node-inspect server . js & # 34;}复制代码launch.json
{ "类型& # 34;: "节点& # 34;, "请求& # 34;: "启动& # 34;, "姓名& # 34;: "NPM创业& # 34;, "runtimeExecutable & # 34: "npm & # 34, "runtimeArgs & # 34: ["跑& # 34;, "调试& # 34;], "端口& # 34;:9229}复制代码类型脚本调试VS代码Node.js内置的调试器支持JaScript源码图,可以用来调试预翻译的代码,如类型脚本、压缩和混淆的JaScript代码等。源码可以在源码图的支持下进行调试。
我准备了一个简单的TS服务器演示,可以直接克隆源代码进行本地测试。下面是项目中的src/index.ts文件,它创建了一个HTTP服务器。
将*作为http从& # 34;http & # 34;设req count = 1;http。createServer((req,RES)= & gt;{ const message = `请求计数:$ { req Count } `;res.writeHead(200,{ & # 34;内容类型& # 34;: "文本/html & # 34;});RES . end(` & lt;html & gt& ltdiv & gt$ { message } & lt/div & gt;& lt/html & gt;`);console . log(& # 34;已处理的请求:& # 34;+req count++);}) .听(3000);console . log(& # 34;在端口3000上运行的服务器& # 34;);复制代码以创建tsconfig.json配置,并编译该配置以生成源映射。
{ "编译器选项& # 34;: { "outDir & # 34: "。/dist & # 34;, "sourceMap & # 34:true }、& # 34;包括& # 34;: ["src/* */* & # 34;]}用tsc编译复制的代码,生成JS代码:dist/index.js,创建调试配置。条目文件是dist/index.js。
{ "类型& # 34;: "节点& # 34;, "请求& # 34;: "启动& # 34;, "姓名& # 34;: "启动程序& # 34;, "程序& # 34;: "$ { workspace folder }/dist/index . js & # 34;, "skipFiles & # 34: ["& ltnode _ internals & gt/**"]}复制代码然后破点开始调试。当浏览器访问http://localhost:3000时,可以看到调试已经进入TS文件。
远程调试
当我们需要在真实服务器等远程运行环境下调试Node.js时,可以使用上述方法在服务器上开启Node.js的调试功能,在本地连接远程调试端口进行调试。
默认情况下,VS代码支持远程调试。我们需要在launch.json配置文件中指定远程服务的IP地址和端口,如下所示:
{ "类型& # 34;: "节点& # 34;, "请求& # 34;: "附上& # 34;, "姓名& # 34;: "远程调试& # 34;, "地址& # 34;: "IP地址& # 34;, "端口& # 34;: "9229"}复制代码VS代码会自动加载远程文件,并显示为只读代码以便调试。
如果想在调试过程中编辑源代码或者有更好的调试体验,可以设置远程文件夹和本地项目之间的映射。VS代码提供了localRoot和remoteRoot属性来映射本地VS代码项目和(远程)Node.js文件夹:
{ "类型& # 34;: "节点& # 34;, "请求& # 34;: "附上& # 34;, "姓名& # 34;: "远程调试& # 34;, "地址& # 34;: "IP地址& # 34;, "端口& # 34;: "9229", "localRoot & # 34: "$ { workspace folder }/src & # 34;, "remoteRoot & # 34: "/var/user/& # 34;}建立映射关系后,可以在本地项目中调试复制的代码,远程断点信息会同步到本地项目,使用起来非常方便。
子进程调试
与普通流程调试原理一致,子流程调试也需要传入- inspect参数,需要特别注意,否则无法发起流程调试。
以下是通过子进程启动服务器的示例:
// fork.js文件const { spawn } = require(& # 34;child _ process & # 34);const sp = spawn(& # 34;节点& # 34;, ["。/fork _ server . js & # 34;]);console . log(& # 34;父进程PID & # 34,sp . PID);sp . stdout . on(& # 34;数据& # 34;,(数据)= & gt{ console . log(` stdout:$ { data } `);});sp . stderr . on(& # 34;数据& # 34;,(数据)= & gt{ console . error(` stderr:$ { data } `);});如果复制的代码直接使用node – inspect启动主进程,会发现只显示主进程的调试端口,这是因为我们在程序中提升进程时没有传递- inspect选项。
这里,我们在启动进程时添加了- inspect参数,并注意指定一个端口号,而不是默认的9229端口,以避免调试端口冲突。
-const sp = spawn(& # 34;节点& # 34;, ["。/fork _ server . js & # 34;]);+const sp = spawn(& # 34;节点& # 34;, ["-inspect = 9230 & # 34;, "。/fork _ server . js & # 34;]);当复制代码再次启动时,您可以看到两个调试信息输出。
当然,怎么能少了强大的VS代码呢?VS代码的节点调试器提供了一种机制来跟踪所有子进程,并在调试模式下自动链接进程。您可以通过autoAttachChildProcesses属性打开此机制:
{ "类型& # 34;: "节点& # 34;, "请求& # 34;: "启动& # 34;, "姓名& # 34;: "启动程序& # 34;, "程序& # 34;: "$ { workspace folder }/fork . js & # 34;, "autoAttachChildProcesses & # 34:true}复制代码启动后,可以调试父进程或子进程的断点,效果如下。
结语
如果你有什么想说的,请在评论区留言。
对了,边肖给大家准备了一套2020年最新的web前端资料,有需要的可以自己拿。
1.喜欢+评论(勾选“同时转发”)
2.注意边肖。并私信回复关键词【信息】(一定要发私信~在手机APP上点击我的头像可以看到私信按钮)。一些信息如下。
参考文献
调试-入门| Node.js
使用Visual Studio代码调试Node.js应用程序
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。