代码调试有时候是一种充斥挑战的工作,如果有一个趁手的调试工具的话,往往能够做到事倍功半的成果。得益于这些年的疾速倒退,在 NodeJS 生态中曾经有了多种调试工具能够应用。咱们往年就来分享几个罕用的调试工具。
在 NodeJS 的代码调试中,通常又两大类调试办法,一种是打印日志,另一种是间接调试代码。咱们当初来别离阐明。
日志
日志能够帮忙咱们记录在程序运行过程中的一些状态和错误信息。通过日志,咱们能够疾速的找到出问题的代码。比方借助于异样日志,咱们能够疾速的定位到具体的代码行。
debug 模块
debug 是很多 NodeJS 包和框架应用的日志工具。这个包的长处是能够通过环境变量的模式细粒度的管制打印哪些日志。
比方在上面的代码中,假如咱们先发送了一些申请,而后又承受到了响应数据。
// index.js
const debugHttpIncoming = require('debug')('http:incoming')
const debugHttpOutgoing = require('debug')('http:outgoing')
let outgoingRequest = {url: 'https://google.com'}
// sending some request
debugHttpOutgoing('sending request to %s', outgoingRequest.url)
let incomingRequest = {body: '{"status":"ok"}'
}
// serving some request
debugHttpOutgoing('got JSON body %s', incomingRequest.body)
当咱们通过如下形式启动程序的时候:
DEBUG=http:incoming,http:outgoing node index.js
日志展现如下:
同时,debug 模块还反对 *
通配符,咱们能够通过 DEBUG=http:* node index.js
取得下面雷同的日志输入。
记录日志到文件
通常,咱们须要将利用运行的日志做长久化解决,最简略的形式就是记录到文件。
pino 是一个高性能的日志模块,与 bunyan 相似,然而性能更好。
以下是几种日志模块的性能数据比照:
benchWinston*10000: 2226.117ms
benchBunyan*10000: 1355.229ms
benchDebug*10000: 445.291ms
benchLogLevel*10000: 322.181ms
benchBole*10000: 291.727ms
benchPino*10000: 269.109ms
benchPinoExtreme*10000: 102.239ms
pino 应用非常简单:
const pino = require('pino')()
pino.info('hello pino')
pino.info('the answer is %d', 42)
pino.error(new Error('an error'))
下面的代码,日志输入如下:
{"level":30,"time":1632626946507,"pid":77749,"hostname":"everfind-MacBook-Pro.local","msg":"hello pino"}
{"level":30,"time":1632626946508,"pid":77749,"hostname":"everfind-MacBook-Pro.local","msg":"the answer is 42"}
{"level":50,"time":1632626946508,"pid":77749,"hostname":"everfind-MacBook-Pro.local","stack":"Error: an error\n at Object.<anonymous> (/Users/everfind/workspace/ztest/test/pino.js:5:12)\n at Module._compile (internal/modules/cjs/loader.js:1072:14)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)\n at Module.load (internal/modules/cjs/loader.js:937:32)\n at Function.Module._load (internal/modules/cjs/loader.js:778:12)\n at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)\n at internal/main/run_main_module.js:17:47","type":"Error","msg":"an error"}
调试
NodeJS 内置调试模块
NodeJS 提供了内置的调试模块。应用起来非常简单间接,毛病是没有 UI 页面,纯命令行操作。
$ node debug index.js
咱们通过 debugger
语句来设置断点。
const express = require('express');
const app = express();
app.get('/', (req, res) => {
debugger;
res.send('ok');
});
app.listen(3000);
内置的调试模块反对如下命令:
- cont 或 c –- 继续执行
- next 或 n –- 往下一步
- step 或 s –- 进入函数
- out 或 o –- 退出函数
- repl –- 刷新上下文信息
V8 Inspector
咱们还能够通过 V8 inspector,应用 Chrome 的 DevTools 来调试 NodeJS 代码。
$ node --inspect index.js
下面这条命令,通过 --inspect
参数通知 NodeJS 启用 V8 Inspector。之后咱们在 Chrome 中输出 chrome://inspect/
,而后找到咱们要调试的那个文件,就能够应用 Chrome DevTools 调试代码了。
有时候,咱们须要在代码的入口处开始调试,则能够通过 --inspect-brk
来在起始地点开始调试。
$ node --inspect-brk index.js
VSCode
最初咱们介绍如何在 VSCode 中调试代码,这也是最高频应用的。
通常咱们能够间接通过菜单启动调试,就像下面的演示成果那样。
如果咱们须要一些高级设置,VSCode 容许咱们配置一个 .vscode/launch.json
文件,来通知 VSCode 如何启动调试器。
默认的配置项如下:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}/index.js"
},
{
"type": "node",
"request": "attach",
"name": "Attach to Port",
"address": "localhost",
"port": 5858
}
]
}
对于每个配置项的作用和具体用法,能够在 VSCode 的文档中查问。
另外,如果咱们在 VSCode 的内置命令行通过 node --inspect
启动程序的话,会主动激活 VSCode 的调试性能。
常见面试知识点、技术解决方案、教程,都能够扫码关注公众号“众里千寻”获取,或者来这里 https://everfind.github.io。