调试 node.js 程序
调试 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 程序的更多相关文章
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 在Visual Studio上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- 用node-inspector调试Node.js(转自NOANYLOVE'S BLOG)
原文地址:http://www.noanylove.com/2011/12/node-the-inspector-debugging-node-js/ 用node-inspector调试Node.js ...
- 【译】在 Chrome 开发者工具中调试 node.js
原文链接 : Debugging Node.js in Chrome DevTools 原文作者 : MATT DESLAURIERS 译文出自 : 掘金翻译计划 译文链接 : https://git ...
- vscode 调试node.js
在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求. 作为前端开发工程师,以往我们开发的JavaScript程序都运行在浏览器端,利用Chrome提供的开发者工具就可 ...
- 在 Chrome 开发者工具中调试 node.js
命令行工具 devtool ,它可以在 Chrome 的开发者工具中运行 Node.js 程序. 下面的记录显示了在一个 HTTP 服务器中设置断点的情况. 该工具基于 Electron 将 Node ...
- 在Visual Studio 2013 上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序
物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...
- 使用events.EventEmitter 控制Node.js 程序执行流程
使用events.EventEmitter 控制Node.js 程序执行流程 标题写的可能也不太对,大家领会精神: Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. ...
随机推荐
- IdentityServer4迁移至3.x版本注意问题详解
前言 之前有一位购买我课程的童鞋利用最新的IdentityServer4版本即对应.NET Core 3.x,发布到生产环境在学习,结果出了一些问题,此前我并未过多关注IdentityServer4升 ...
- CSS 加载动画
CSS加载动画 实现加载动画效果,需要的两个关键步骤: 1.做出环形外观 border:16px solid #f3f3f3; border-radius:50%; border-top:16px s ...
- mysql 存储过程 执行存储过程修改了表中所有行的信息
存储过程中的where条件语句,如果传入的参数和表字段名相同,存储过程就会把这个约束条件忽略.小结:存储过程中传递的参数名不要和字段名相同.特别是修改.删除等操作,可能会对整张表产生影响.后果会很严重 ...
- Linq的整型或实体类null引发的报错问题
经常在程序中遇到两个空值报错问题: 问题1:int类型如果为不可空,假如传进去null,会报错 问题2:EF的获得单个实体的Model如果为空,那么后面如果跟上属性会报错 解决问题1: 一般属性都设为 ...
- zookeeper伪集群搭建
zookeeper伪集群搭建 1. 下载zookeeper: https://zookeeper.apache.org/ 2. 解压: tar -zxvf zookeeper-3.4.14.tar.g ...
- 解决layui表单ajax提交回调函数不起作用问题的两种方式
最近想用layui开发一个论坛模板用的是fly-ui,才接触layui对其还不太熟悉.一个简单的登录就困扰了我很久.登录的form通过ajax提交回调函数老是不起作用.经过浪费了N多时间的调试,发现l ...
- 基于springcloud框架搭建项目-Eureka篇(一)
springcloud项目近年来算是很流行的了,不少公司项目目前都用到了,毕竟优点很多,刚好公司项目用到了,根据自己的理解,简单搭建一下,以便以后学习 这里简单的介绍一下它: SpringCloud, ...
- 复制url事故:出现特殊的字符%E2%80%8B
复制url事故:出现特殊的字符%E2%80%8B 问题:直接其他地方复制过来的中文字进行网页搜索.或者中文字识别排序等情况的,会出现搜索不到的情况. 解决方法:可能存在复制源里面的文字带了空白url编 ...
- Vue2.0 【第一季】第4节 v-text & v-html
目录 Vue2.0 [第一季]第4节 v-text & v-html 第四节 v-text & v-html Vue2.0 [第一季]第4节 v-text & v-html 第 ...
- Linux内核文档:如何写符合 kernel-doc 规范的注释
简介 Linux内核使用 Sphinx 实现把 Documentation 目录下的 reStructuredText 文件转换为非常漂亮的文档.文档既可以通过 make htmldocs 转换成 H ...