如何用最好的工具来调试node.js
Posted 大前端工程师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用最好的工具来调试node.js相关的知识,希望对你有一定的参考价值。
代码调试是开发中非常具有挑战性的一个环节,通过debug可以发现和修复代码中的缺陷。Node.js开发同样需要调试。非常幸运的是,在过去的一段时间内,调试工具有了很大的改进。下面介绍node.js应用有哪些调试工具。通过【阅读原文】还能看到一些视频介绍。
本文从两方面介绍node.js调试工具:
1、如何查看日志,这类工具用于从生产环境发现问题。 2、如何在开发环境中对应用进行调试。
打印Node.js日志
开发过程中,日志记录是必不可少的事情,在生产环境中是无法进行调试,因此日志就成了重要的报错和异常信息的来源。通过日志可以查找和诊断问题,并修复系统bug。在node.js应用中,build项目的时候有很多选择来记录日志。许多npm模块都内置调试模块,当需要调试的时候直接打开即可。当自己写一个node.js应用的时候,同样需要记录日志。下面介绍工具pino
在介绍pino之前,我们需要对日志的概念有个了解,常规日志需求主要有四个:
时间戳(timestamps),表示日志对应的代码执行的时间段。
格式化(formatting),写日志必须要易于理解,并且让查看日志的人能够直接解析出该段日志对应的代码状态。
日志目的(log destination),常规日志必须始终是标准的输入/输出。
日志级别(log levels),日志必须分等级,大多数情况下开发者不会对普通的调试信息感兴趣。
Node.js dubug 模块
建议:npm发布的模块。 debug 是一个轻量并且实用的Node.js模块,它是@RisingStack在Node.js核心调试技术出现后发行的。
下面介绍一下如何使用debug进行调试。假设你写了一段如下所示的发送服务器请求的代码,可以手法若干个服务器请求。
// index.js
const debugHttpIncoming = require('debug')('http:incoming')
const debugHttpOutgoing = require('debug')('http:outgoing')
let outgoingRequest = {
url: 'https://risingstack.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。
DEBUG=http:incoming,http:outgoing node index.js
在编辑器中的输出如下图所示。
debug模块支持星号(*)通配符。如果想要得到与上一次调试相同的结果,在开启debug的时候将指令写成
DEBUG=http:* node index.js
debug模块很方便,npm上很多模块都支持debug(express和koa),截止至本文发布时间,有大约14000个模块支持debug。
pino 日志记录模块
推荐原因:适用于比较重视性能的应用
pino是一个运行起来非常快的日志记录工具,参考了bunyan。在很多情况下,它比其他日志记录工具快6倍(例如bunyan或者winston)。
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.239m
开启pino:
const pino = require('pino')()
pino.info('hello pino')
pino.info('the answer is %d', 42)
pino.error(new Error('an error'))
上述的代码可以生成以下日志:
{"pid":28325,"hostname":"Gergelys-MacBook-Pro.local","level":30,"time":1492858757722,"msg":"hello pino","v":1}
{"pid":28325,"hostname":"Gergelys-MacBook-Pro.local","level":30,"time":1492858757724,"msg":"the answer is 42","v":1}
{"pid":28325,"hostname":"Gergelys-MacBook-Pro.local","level":50,"time":1492858757725,"msg":"an error","type":"Error","stack":"Error: an error\n at Object.<anonymous> (/Users/gergelyke/Development/risingstack/node-js-at-scale-debugging/pino.js:5:12)\n at Module._compile (module.js:570:32)\n at Object.Module._extensions..js (module.js:579:10)\n at Module.load (module.js:487:32)\n at tryModuleLoad (module.js:446:12)\n at Function.Module._load (module.js:438:3)\n at Module.runMain (module.js:604:10)\n at run (bootstrap_node.js:394:7)\n at startup (bootstrap_node.js:149:9)\n at bootstrap_node.js:509:3","v":1}
内置的Node.js debug模块
Node.js自带一个进程外的调试工具,通过tcp协议和内置的调试客户端可以访问。使用下面的指令可启动debug:
$ node debug index.js
这个debug调试代理功能并不是很全面,也没有一个花哨的用户界面,只是提供了简单的检查功能。可以通过在代码中添加debugger来添加断点。
const express = require('express')
const app = express()
app.get('/', (req, res) => {
debugger
res.send('ok')
})
通过添加断点,代码执行会停止在断点添加的地方。通过使用快捷键可以让调试继续执行。以下列举了常用的debug快键键。
cont/c - 继续运行。
next/n - 下一步。
step/s - 步进。
out/o - 步出。
repl - 评估脚本环境。
Node.js集成V8监视器
集成V8检查,可以在node.js实例调试的时候通过Chrome Debugging Protocol 将调试过程移植到chrome自带的调试器中进行断点调试。 当开始一个node应用的时候,可以通过以下语句开启V8检查。
$ node --inspect index.js
在大多数情况下,在代码库的第一行加断点停止执行,并且从断点处单步执行是非常有意义的。这样不会错过任何执行语句。
如何在vscode中调试node语句
许多ide都支持断点调试,在vscode中嵌入了node.js debug模块。 下图展示了VS code中dubug接口,包括上下文变量(context variables),监视表达式(watched expressions),调用堆栈(call stack)和断点(breakpoints)。
VS Code 调试器最有价值的地方在于,可以添加有条件断点。当有添加断点的条件表达式的值为true时,代码会在断点处停下来。
如果你想添加更多高级设置,可以配置.vscode/launch.json,这是VS Code中自带的。该文件主要描述如何开启dubug,默认为以下格式。
{
"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
}
]
}
想要了解更多关于launch.json的高级配置,可访问点击访问想要了解更多关于VS Code debug,可访问点击访问
欢迎大家关注大前端工程师:
以上是关于如何用最好的工具来调试node.js的主要内容,如果未能解决你的问题,请参考以下文章
[Node] 如何使用 VSCode 调试 child_process