调试 node.js 程序

在程序开发中,如何快速的查找定位问题是一项非常重要的基本功。在实际开发过程中,或多或少都会遇到程序出现问题导致无法正常运行的情况,因此,调试代码就变成了一项无法避免的工作。这里简单介绍下如何调试 node.js 程序。

使用 console.log

Node 提供了全局的 console 对象,该对象可以输出格式化的字符串。

console.log 是调试 Node 模块最简单的工具,console.log 主要有两个作用:一是将对象序列化为一个字符串,另一个是向标准输出流输出结果。

使用 console.log 检查对象:

const obj = {
a: 1,
b: 2
} console.log(obj)

这段代码将打印出以下信息:

{ a: 1, b: 2 }

注意:实质上 console.log 没有进行任何格式化操作,而是 console.log 内部调用了 util.format 将传入的参数格式化,并且将结果输出到标准输出流中。

console.log 函数只检查对象的自有可枚举属性,即在原型链上的属性以及不可枚举的属性都不会显示。

例如:

const obj = Object.defineProperty({
a: 1,
b: 2
}, 'a', {
enumerable: false
}) console.log(obj)

不可枚举属性 a 不会显示,这段代码将打印出以下信息:

{ b: 2 }

console.log 函数可以通过 util.format 函数提供向字符串中插入数值的能力,在字符串中使用 % 前缀作占位符。

例如:

console.log('an object: %j', {a: 1, b: 2})

这段代码将打印出以下信息:

an object: {"a":1,"b":2}

%j 是一个 JSON 占位符。即如果参数包含循环引用,则替换为字符串 '[Circular]'。

当然除了 console.log 函数,还可以使用 console 对象的其他函数调试代码,例如:console.error、console.table、console.info等等。

注意:在 Node 中,如果向进程的输出流中写入数据是一种阻塞操作,写入记录时会阻塞事件循坏。因此,在实际项目中应避免使用 console.log。

使用 debugger 调试器

使用 console.log 检查变量虽然简单易用,但它也有很糟糕的一面,在复杂程序中很难定位和发现问题,程序输出冗长,阻塞事件循环等。

庆幸的是,V8 引擎导出了一个支持 Node 的调试接口。因此,可以使用 Node 内置的调试器调试你的程序。

创建一个错误的程序:

var n = 0

function init () {
n = 1
} function incr () {
var n = n + 1
} init()
console.log('n before: %d', n) incr()
console.log('n after: %d', n)

运行程序,输出结果如下:

n before: 1
n after: 1

变量 n 并没有如期递增,接下来使用调试模式启动 Node 调试程序:

node --inspect index.js

这样就会以调试模式启动 Node,可以看到调试器的提示信息如下:

Debugger listening on ws://127.0.0.1:9229/a94b1d29-81cb-461b-8abc-f1bf87c767b1
For help, see: https://nodejs.org/en/docs/inspector
n before: 1
n after: 1

调试的程序代码非常少,所以调试立即就完成结束了。

可以通过命令在程序第一行设置断点:

node --inspect-brk index.js

调试器提示信息如下:

Debugger listening on ws://127.0.0.1:9229/def735ed-3a2a-4772-a40d-077939e76b83
For help, see: https://nodejs.org/en/docs/inspector

这样调试就不会立即结束。

接着,打开 Chrome 浏览器,在地址栏输入:

chrome://inspect/#devices

在界面 Remote Target 标签内容中找到要调试的目标(Target)文件,点击目标中的 inspect 链接就可以进入浏览器调试面板调试程序了。接下来的调试操作方式和平时调试普通 JavaScript 代码一样。

调试 node.js 程序的更多相关文章

  1. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...

  2. 在Visual Studio上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  3. 用node-inspector调试Node.js(转自NOANYLOVE'S BLOG)

    原文地址:http://www.noanylove.com/2011/12/node-the-inspector-debugging-node-js/ 用node-inspector调试Node.js ...

  4. 【译】在 Chrome 开发者工具中调试 node.js

    原文链接 : Debugging Node.js in Chrome DevTools 原文作者 : MATT DESLAURIERS 译文出自 : 掘金翻译计划 译文链接 : https://git ...

  5. vscode 调试node.js

    在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求. 作为前端开发工程师,以往我们开发的JavaScript程序都运行在浏览器端,利用Chrome提供的开发者工具就可 ...

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

    命令行工具 devtool ,它可以在 Chrome 的开发者工具中运行 Node.js 程序. 下面的记录显示了在一个 HTTP 服务器中设置断点的情况. 该工具基于 Electron 将 Node ...

  7. 在Visual Studio 2013 上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  8. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序

    物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...

  9. 使用events.EventEmitter 控制Node.js 程序执行流程

    使用events.EventEmitter 控制Node.js 程序执行流程 标题写的可能也不太对,大家领会精神: Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. ...

随机推荐

  1. 【ThinkPHP6:从TP3升级到放弃】1. 前言及准备工作

    春节期间因为疫情的关系出不去门,所以就研究了一下ThinkPHP的最新版本6.0.2, 自己写了一个博客程序. 现在, 打算写一个ThinkPHP6的专题, 用来把自己在写博客的过程中入过的坑和获得的 ...

  2. sql--测试商品的重要度,是否需要及时补货

    表1:商品表 表2:商品售卖表 需求:算出商品的平均点击率.平均销售.商品受欢迎度 1.使用inner join查出每件商品的点击率和销售额度 ) as selas from test a left ...

  3. APScheduler使用总结

    安装 pip install apscheduler APScheduler组件 1.triggers(触发器) 触发器中包含调度逻辑,每个作业都由自己的触发器来决定下次运行时间.除了他们自己初始配置 ...

  4. DIV的失去焦点(blur)实现

    用防抖实现DIV鼠标移出消失   由于div标签本身不支持onblur事件,所以对于点击一个按钮弹出的div,我们想要当这个div失去焦点的时候,让它消失不能使用的onblur来实现.  但是可以利用 ...

  5. 使用tf serving-gpu时,没有安装NVIDIA时报的错?

    当部署tf serving-gpu时,出现上述的错误,有两种情况: 1.服务器中已经安装NVIDIA驱动了,只是版本比较低了,需要升级一下比较新的nvidia驱动: 2.就是服务器中没有安装NVIDI ...

  6. dom节点及对节点的常用操作方法

    dom节点及对节点的常用操作方法 在说dom节点前,先来看看页面的呈现: dom渲染流程:  1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元 ...

  7. Mac 下 Docker 运行较慢的原因分析及个人见解

    在mac 使用 docker 的时候,我总感觉程序在 docker 下运行速度很慢,接下来我一一分析我遇到的问题,希望大家能进行合理的讨论和建议. 问题: valet 下打开 laravel 首页耗时 ...

  8. Canny检测算法与实现

    1.原理 图象边缘就是图像颜色快速变化的位置,对于灰度图像来说,也就是灰度值有明显变化的位置.图像边缘信息主要集中在高频段,图像锐化或检测边缘实质就是高通滤波.数值微分可以求变化率,在图像上离散值求梯 ...

  9. AspNetCore3.1_Middleware源码解析_3_HttpsRedirection

    概述 上文提到3.1版本默认没有使用Hsts,但是使用了这个中间件.看名字就很好理解,https跳转,顾名思义,就是跳转到 https地址. 使用场景,当用户使用http访问网站时,自动跳转到http ...

  10. WEB应用之http协议和httpd闲聊

    什么是web?在日常生活中我们常常听到web这个词,它到底是什么呢?今天我们来聊一聊web应用http协议:相信生活在如今互联网时代的我们,http这个协议应该对我们不是很陌生吧!比如双十一双十二我们 ...