在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 2
| const logger = require('pino')(); logger.info('hello world');
|
- 配置
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 = { }; 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
来解决深度限制问题。