使用console.log()
进行调试时,如何获取完整对象?
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
console.log(myObject);
输出:
{ a: 'a', b: { c: 'c', d: { e: 'e', f: [Object] } } }
但我想看看属性f
的内容。
你需要使用util.inspect()
:
const util = require('util')
console.log(util.inspect(myObject, {showHidden: false, depth: null}))
// alternative shortcut
console.log(util.inspect(myObject, false, null, true /* enable colors */))
输出
{ a: 'a', b: { c: 'c', d: { e: 'e', f: { g: 'g', h: { i: 'i' } } } } }
这两种用法都可以应用
// more compact and colour can be applied (better for process managers logging)
console.dir(queryArgs, { depth: null, colors: true });
// clear list of actual values
console.log(JSON.stringify(queryArgs, undefined, 2));
你可以简单地向你的对象添加一个inspect()
方法,它将覆盖console.log
消息中对象的表示
例如:
var myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
myObject.inspect = function(){ return JSON.stringify( this, null, ' ' ); }
然后,您的对象将在console.log和node shell中按需要表示
一个简单的技巧是使用debug
模块在运行脚本时将DEBUG_DEPTH=null
添加为环境变量
防爆。
DEBUG = * DEBUG_DEPTH = null节点index.js
在你的代码中
const debug = require('debug');
debug("%O", myObject);
节点REPL有一个内置的解决方案来覆盖对象的显示方式,请参阅here。
打印值时,REPL模块内部使用
util.inspect()
。但是,util.inspect
将调用委托给对象的inspect()
函数(如果有的话)。
我认为它对你有用。
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
console.log(JSON.stringify(myObject, null, '\t'));
你可以使用JSON.stringify
,并获得一些很好的缩进,也许更容易记住语法。
console.log(JSON.stringify(myObject, null, 4));
{
"a": "a",
"b": {
"c": "c",
"d": {
"e": "e",
"f": {
"g": "g",
"h": {
"i": "i"
}
}
}
}
}
第三个参数设置缩进级别,因此您可以根据需要进行调整。
如果需要,请在此处提
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
来自(至少)Node.js v0.10.33
(稳定)/ v0.11.14
(不稳定)的许多有用答案的汇编,大概是通过(至少)v7.7.4
(此答案的最新更新版本的当前版本)。
tl;博士
util.inspect()
是诊断输出的核心:console.log()
和console.dir()
以及Node.js REPL隐含地使用util.inspect()
,因此通常没有必要require('util')
并直接调用util.inspect()
。
要获得问题中示例的所需输出:
console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion
详情如下。
console.log()
(及其别名,console.info()
):
如果第一个参数不是格式字符串:util.inspect()
会自动应用于每个参数:
o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
请注意,在这种情况下,您无法通过util.inspect()
传递选项,这意味着2个显着的限制:
输出的结构深度限制为2级(默认值)。
既然你不能用console.log()
改变它,你必须使用console.dir()
:console.dir(myObject, { depth: null }
打印无限深度;见下文。
你不能打开语法着色。
如果第一个参数是一个格式字符串(见下文):使用util.format()
根据格式字符串打印剩余的参数(见下文);例如。:
o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
注意:
没有占位符来表示对象util.inspect()
风格。
使用%j
生成的JSON并不是很漂亮。console.dir()
:
只接受1个参数来检查,并且总是应用util.inspect()
- 本质上,util.inspect()
的包装器默认情况下没有选项;例如。:
o = { one: 1, two: 'deux', foo: function(){} }; console.dir(o); // Effectively the same as console.log(o) in this case.
node.js v0.11.14 +:可选的第二个参数指定util.inspect()
的选项 - 见下文;例如。:
console.dir({ one: 1, two: 'deux'}, { colors: true }); // node 0.11+: Prints object representation with syntax coloring.
util.inspect()
隐式打印任何表达式的返回值;
即,只需键入变量名称并按Enter键将打印其值的检查版本;例如。:
o = { one: 1, two: 'deux', foo: function(){} } // echoes the object definition with syntax coloring.
util.inspect()
自动(并且总是)漂亮地打印对象和数组表示,但仅在需要时生成多行输出 - 如果所有内容都适合一行,则只打印一行。
breakLength
选项覆盖60个字符的限制;如果你把它设置为Infinity
,一切都输出在一行。如果您想要更好地控制漂亮打印,请考虑将JSON.stringify()
与第三个参数一起使用,但请注意以下事项:
module
。JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces
util.inspect()
选项对象(第二个参数):
来源:http://nodejs.org/api/util.html#util_util_format_format
可以传递一个可选的选项对象,它可以改变格式化字符串的某些方面:
showHidden
如果true
,那么对象的不可枚举属性[当你使用for keys in obj
或Object.keys(obj)
时指定不显示的属性]也会显示。默认为false
。depth
告诉我在格式化对象时检查多少次递归。这对于检查大型复杂对象很有用。默认为2.要使其无限递归,请传递null
。colors
如果为true,则输出将使用ANSI颜色代码进行样式设置。默认为false
。颜色可定制[... - 见链接]。customInspect
如果false
,则不会调用在被检查对象上定义的自定义inspect()
函数。默认为true
。util.format()
格式字符串占位符(第一个参数)
来源:http://nodejs.org/api/util.html#util_util_format_format
%s
- 字符串。%d
- 数字(整数和浮点数)。%j
- JSON。%
- 单个百分号('%')。这不会消耗参数。另一个简单的方法是将其转换为json
console.log('connection : %j', myObject);
试试这个:
console.dir(myObject,{depth:null})
从Node.js 6.4.0开始,可以使用util.inspect.defaultOptions
优雅地解决这个问题:
require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
也许console.dir
就是你所需要的。
http://nodejs.org/api/console.html#console_console_dir_obj
在obj上使用util.inspect并将结果字符串输出到stdout。
如果需要更多控制,请使用util选项。
你也可以
console.log(JSON.stringify(myObject, null, 3));