在Node.js的console.log()中获取完整对象而非'[Object]'

在Node.js的console.log()中获取完整对象而非’[Object]’

技术背景

在Node.js中,使用console.log()打印对象时,可能只会显示[Object],无法看到对象的完整结构。这是因为console.log()默认对对象的输出有一定限制,比如深度限制等。为了获取对象的完整信息,需要采用一些特定的方法。

实现步骤

使用util.inspect()

1
2
3
4
const util = require('util');
console.log(util.inspect(myObject, { showHidden: false, depth: null, colors: true }));
// 或者使用快捷方式
console.log(util.inspect(myObject, false, null, true));

使用JSON.stringify()

1
console.log(JSON.stringify(myObject, null, 4));

使用console.dir()

1
console.dir(myObject, { depth: null });

设置util.inspect.defaultOptions.depth

1
2
3
const util = require('util');
util.inspect.defaultOptions.depth = null;
console.log(myObject);

使用现代日志库pino

  1. 安装
1
npm install pino
  1. 使用
1
2
const logger = require('pino')();
logger.info('hello world');
  1. 配置
1
2
3
4
5
6
7
8
const logger = pino({
depthLimit: 10,
edgeLimit: 200,
customLevels: {
foo: 35
}
});
logger.foo('hi');

自定义inspect方法

1
2
3
4
5
6
const util = require('util');
var myObject = {
/* nested properties not shown */
};
myObject[util.inspect.custom] = function() { return JSON.stringify(this, null, 4); };
console.log(util.inspect(myObject));

替换默认console

1
2
3
4
5
6
7
globalThis.console = new console.Console({
inspectOptions: {
depth: null,
},
stdout: process.stdout,
stderr: process.stderr,
});

自定义console.obj方法

1
console.obj = (...args) => args.forEach(obj => console.log(require('util').inspect(obj, false, null, true)));

核心代码

示例对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const myObject = {
"a": "a",
"b": {
"c": "c",
"d": {
"e": "e",
"f": {
"g": "g",
"h": {
"i": "i"
}
}
}
}
};

使用util.inspect()

1
2
const util = require('util');
console.log(util.inspect(myObject, { showHidden: false, depth: null, colors: true }));

使用JSON.stringify()

1
console.log(JSON.stringify(myObject, null, 4));

使用console.dir()

1
console.dir(myObject, { depth: null });

最佳实践

  • 开发调试阶段:可以使用util.inspect()console.dir()来查看对象的完整结构,同时可以开启语法着色(colors: true),方便阅读。
  • 生产环境:建议使用专业的日志库,如pino,它可以处理循环引用、格式化输出、设置日志级别等问题,提高日志管理的效率。

常见问题

JSON.stringify()的局限性

  • 循环引用:如果对象存在循环引用,JSON.stringify()会抛出错误。可以使用支持处理循环引用的日志库,如pino
  • 方法丢失JSON.stringify()不会包含对象的方法。如果需要查看方法信息,应使用util.inspect()

console.log()的深度限制

console.log()默认输出对象的深度为2级。可以使用console.dir()并设置depth: null来解决深度限制问题。


在Node.js的console.log()中获取完整对象而非'[Object]'
https://119291.xyz/posts/get-full-object-in-nodejs-console-log/
作者
ww
发布于
2025年6月3日
许可协议