第六十八期:其实我不会调试Node

536 阅读4分钟

这里记录工作中遇到的技术点,以及自己对生活的一些思考,周三或周五发布。

封面图

我真的不知道怎么调试Node

有很多Node模块都依赖于第三方的调试模块,一些比较有名的代码库,比如express ,Koa 等等,同样也使用调试模块儿。

在许多代码库中,有大量的调试日志相关的内容,我们可以通过他们来理解我们的应用程序是怎样的一个行为。

启动调试日志

我们还是从简单的创建一个项目开始。

mkdir app
cd app
npm init -y
npm install --save express
touch index.js

index.js中内容如下:

我这里沿用了上期的内容

// require('cute-stack')()
const express = require('express')
const routes = require('./routes')
const app = express()
const stylus = require('stylus')

// if (process.env.NODE_ENV !== 'production') {
// Error.stackTraceLimit = Infinity
// require('longjohn')
// }

// app.use(routes)
app.get('/some.css', (req, res) => {
  const css = stylus(`
    body
      color:red
  `).render(css)
  res.send(css)
})

app.listen(3000)

然后我们开启(debug logging)调试日志:

DEBUG=* node index.js

记得需要先安装下stylus依赖包,不然会报错。

然后我们可以看到如下内容:

我们可以看到类似:

express:application set "x-powered-by" to true +1ms

这样的信息。这条信息告诉我们当前的服务器运行的是哪款软件,当然不公开这些信息,安全性相对来说会高一点。

这些调试日志可以帮助我们理解我们的应用是如何运行的,同时也可以让我们监控到一些我们不希望看到的内容。

我们发起一个请求:

curl http://localhost:3000/some.css

然后终端上会输出下面的内容:

如果你仔细看的话,可以发现,其实它是stylus的解析器解析的一个过程,当然,我们可以过虑掉stylus,只看express的日志。

只需要执行:

DEBUG=express:* node index.js

这时候重新发送请求,就直接将stylus相关的日志过虑掉了。

DEBUG=express:* 命令是如何工作的

刚开始的时候,我们将DEBUG设置为星号,表示启用所有日志。当我们想看express相关的日志时,我们设置成了DEBUG=express:* 表示以express:开头的日志。

按照惯例,模块儿和框架一般使用冒号分割子命名空间。

在调试模块内部代码中,它们从process.env.DEBUG中读取数据,按空格,逗号进行分割,然后转换为正则表达式。

当一个模块需要使用debug模块的时候,它需要一个能够代表自身的命名空间来创建一个方法,这个方法可以在模块启用调试日志的时候,将日志信息进行输出。

每次模块向调试模块进行注册时,都会根据命名空间踢动的正则表达式进行校验。

如果匹配不到,则生成的方日志方法就是noop空函数,这样,调试日志在生产中的成本最低。

如果存在匹配项,返回的日志函数将接受输入,用ANSI代码装饰它,并在每次调用Logger时创建一个时间戳。

如何调试代码

我们可以使用debug模块对代码进行调试。

安装debug模块

npm install --save debug

在需要调试的位置加入代码:

// require('cute-stack')()
const express = require('express')
const routes = require('./routes')
const app = express()
const stylus = require('stylus')
const debug = require('debug')('terrence')

// if (process.env.NODE_ENV !== 'production') {
// Error.stackTraceLimit = Infinity
// require('longjohn')
// }

// app.use(routes)
app.get('/some.css', (req, res) => {
  debug('style requested')
  const css = stylus(`
    body
      color:red
  `).render()
  res.send(css)
})

app.listen(3000)

然后启动程序

DEBUG=terrence node index.js

发起请求后就可以看到结果

生产环境中使用

默认的调试日志并不适用于生成环境。因为默认的日志是为了方便人们阅读,而不是机器阅读。终端支持的带有颜色的ANSI代码存到数据库或保存到文件时会产生额外的污染。

所以,生产环境中,假如我们需要开启日志,我们可以这样做:

DEBUG_COLORS=no DEBUG=* node index.js

JSON格式的日志

我们可以使用pino-debug 模块创建json格式的日志。

安装pino-debug:

npm install --save pino-debug

写个配置文件:

{
  "main": "index.js",
  "scripts": {
    "dev": "node index.js",
    "prod": "node -r pino-debug index.js"
  }
}

运行一下:

DEBUG=* npm run --silent prod

出来的就是JSON格式的日志:

最后

  • 公众号《JavaScript高级程序设计》
  • 公众号内回复”vue-router“ 或 ”router“即可收到 VueRouter源码分析的文档。
  • 回复”vuex“ 或 ”Vuex“即可收到 Vuex 源码分析的文档。

近期公众号的域名过期了,收到回复后,会人工回复对应的内容,谢谢。

全文完,如果喜欢。

请点赞和"在看"吧,最好也加个"关注",或者分享到朋友圈。