如何用最好的工具来调试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进行调试。假设你写了一段如下所示的发送服务器请求的代码,可以手法若干个服务器请求。

 
   
   
 
  1. // index.js

  2. const debugHttpIncoming = require('debug')('http:incoming')  

  3. const debugHttpOutgoing = require('debug')('http:outgoing')

  4. let outgoingRequest = {  

  5.  url: 'https://risingstack.com'

  6. }

  7. // sending some request

  8. debugHttpOutgoing('sending request to %s', outgoingRequest.url)

  9. let incomingRequest = {  

  10.  body: '{"status": "ok"}'

  11. }

  12. // serving some request

  13. debugHttpOutgoing('got JSON body %s', incomingRequest.body)

使用以下指令开启debug。

 
   
   
 
  1. DEBUG=http:incoming,http:outgoing node index.js

在编辑器中的输出如下图所示。

debug模块支持星号(*)通配符。如果想要得到与上一次调试相同的结果,在开启debug的时候将指令写成

 
   
   
 
  1. DEBUG=http:* node index.js

debug模块很方便,npm上很多模块都支持debug(express和koa),截止至本文发布时间,有大约14000个模块支持debug。

pino 日志记录模块

推荐原因:适用于比较重视性能的应用

如何用最好的工具来调试node.jspino是一个运行起来非常快的日志记录工具,参考了bunyan。在很多情况下,它比其他日志记录工具快6倍(例如bunyan或者winston)。

 
   
   
 
  1. benchWinston*10000:     2226.117ms  

  2. benchBunyan*10000:      1355.229ms  

  3. benchDebug*10000:       445.291ms  

  4. benchLogLevel*10000:    322.181ms  

  5. benchBole*10000:        291.727ms  

  6. benchPino*10000:        269.109ms  

  7. benchPinoExtreme*10000: 102.239m

开启pino:

 
   
   
 
  1. const pino = require('pino')()

  2. pino.info('hello pino')  

  3. pino.info('the answer is %d', 42)  

  4. pino.error(new Error('an error'))

上述的代码可以生成以下日志:

 
   
   
 
  1. {"pid":28325,"hostname":"Gergelys-MacBook-Pro.local","level":30,"time":1492858757722,"msg":"hello pino","v":1}

  2. {"pid":28325,"hostname":"Gergelys-MacBook-Pro.local","level":30,"time":1492858757724,"msg":"the answer is 42","v":1}

  3. {"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:

 
   
   
 
  1. $ node debug index.js

这个debug调试代理功能并不是很全面,也没有一个花哨的用户界面,只是提供了简单的检查功能。可以通过在代码中添加debugger来添加断点。

 
   
   
 
  1. const express = require('express')  

  2. const app = express()

  3. app.get('/', (req, res) => {  

  4.  debugger

  5.  res.send('ok')

  6. })

通过添加断点,代码执行会停止在断点添加的地方。通过使用快捷键可以让调试继续执行。以下列举了常用的debug快键键。

  • cont/c - 继续运行。

  • next/n - 下一步。

  • step/s - 步进。

  • out/o - 步出。

  • repl - 评估脚本环境。

Node.js集成V8监视器

集成V8检查,可以在node.js实例调试的时候通过Chrome Debugging Protocol 将调试过程移植到chrome自带的调试器中进行断点调试。 当开始一个node应用的时候,可以通过以下语句开启V8检查。

 
   
   
 
  1. $ 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,默认为以下格式。

 
   
   
 
  1. {

  2.    "version": "0.2.0",

  3.    "configurations": [

  4.        {

  5.            "type": "node",

  6.            "request": "launch",

  7.            "name": "Launch Program",

  8.            "program": "${workspaceRoot}/index.js"

  9.        },

  10.        {

  11.            "type": "node",

  12.            "request": "attach",

  13.            "name": "Attach to Port",

  14.            "address": "localhost",

  15.            "port": 5858

  16.        }

  17.    ]

  18. }

想要了解更多关于launch.json的高级配置,可访问点击访问想要了解更多关于VS Code debug,可访问点击访问

欢迎大家关注大前端工程师:

以上是关于如何用最好的工具来调试node.js的主要内容,如果未能解决你的问题,请参考以下文章

从前后端分离到GraphQL,携程如何用Node实现?

如何用adb连接android手机

[Node] 如何使用 VSCode 调试 child_process

使用 Node.js 服务器调试内存泄漏

如何用JAVA将Excel中的数据导入到sqlserver的表中

在 Chrome 开发者工具中调试 node.js