Node.js 中 console.log 打印对象时显示 [Object],如何看到完整内容?
Node.js 的 console.log 对深层对象只显示 [Object]。本文介绍 util.inspect 的 depth 选项、JSON.stringify 以及 console.dir 三种方法,按需展开嵌套对象并说明输出限制。
解决办法:使用 Node.js 内置的 util.inspect(),把 depth 选项设为 null,即可不限层级地展开整个对象;或者直接使用 console.dir(obj, { depth: null }),更简洁,但 console.dir 会跳过对象自定义 inspect 函数。
方法一:util.inspect
const util = require('util');
const myObject = {
key1: 'value1',
key2: 'value2',
key3: { nestedKey: 'nestedValue' }
};
console.log(util.inspect(myObject, { depth: null }));
depth: null 表示不限制递归深度,不会取消 maxArrayLength、maxStringLength 或总输出长度限制;默认值是 2,超过两层的嵌套就会被折叠成 [Object]。还可以加 colors: true 让输出带颜色,便于阅读。
方法二:console.dir(更简洁)
console.dir 底层就是 util.inspect,可以直接传选项:
console.dir(myObject, { depth: null, colors: true });
方法三:JSON.stringify
如果对象里没有函数、undefined、循环引用,可以序列化成 JSON:
console.log(JSON.stringify(myObject, null, 2));
第三个参数 2 是缩进空格数,输出带格式的多行 JSON。注意:循环引用会抛异常,对象中的函数和 undefined 属性会省略,数组中则通常变为 null;BigInt 默认也会抛异常,所以调试复杂对象时还是推荐 console.dir。
常见问题(FAQ)
Q:生产环境的日志也适合用 console.dir 吗?
A:不适合。生产环境应该用结构化日志库(如 pino、winston)输出 JSON,便于日志系统解析。console.dir 主要用于本地调试。
Q:打印大对象会拖慢程序吗?
A:会。深度展开大对象是同步的序列化操作,在高并发服务里会阻塞事件循环,调试完记得移除。
Q:浏览器里也有这个问题吗?
A:浏览器控制台默认就是交互式展开对象的,不存在 [Object] 折叠问题,其呈现方式与 Node 终端不同,并可能延迟读取对象状态;不能把浏览器展示当作调用时的不可变快照。
[1]: 观测云文档《DataKit 文档》https://docs.guance.com/datakit/