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 }),效果相同且更简洁。
方法一:util.inspect
const util = require('util');
const myObject = {
key1: 'value1',
key2: 'value2',
key3: { nestedKey: 'nestedValue' }
};
console.log(util.inspect(myObject, { depth: null }));
depth: null 表示不限制递归深度;默认值是 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 会被丢弃,所以调试复杂对象时还是推荐 console.dir。
常见问题(FAQ)
Q:生产环境的日志也适合用 console.dir 吗?
A:不适合。生产环境应该用结构化日志库(如 pino、winston)输出 JSON,便于日志系统解析。console.dir 主要用于本地调试。
Q:打印大对象会拖慢程序吗?
A:会。深度展开大对象是同步的序列化操作,在高并发服务里会阻塞事件循环,调试完记得移除。
Q:浏览器里也有这个问题吗?
A:浏览器控制台默认就是交互式展开对象的,不存在 [Object] 折叠问题,这是 Node.js 终端输出的特有行为。