我怎样才能得到完整的对象Node.js的console.log(),而不是“”?
使用console.log()
debugging时,如何获取完整的对象?
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))
输出
{ a: 'a', b: { c: 'c', d: { e: 'e', f: { g: 'g', h: { i: 'i' } } } } }
请参阅util.inspect()
文档 。
您可以使用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
(至less)Node.js v0.10.33
(stable)/ v0.11.14
(unstable)的许多有用的答案的编译可能通过(至less) 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()
):- 如果第一个参数不是格式string :
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 }
打印无限深度 ;见下面。
- 因为你不能用
- 你不能把语法着色。
- 输出的结构深度 限于2个级别 (默认)。
-
- 如果第一个参数是一个格式string (见下面):使用
util.format()
来打印基于格式string的其余参数(见下文)。 例如:-
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不是非常漂亮的。
- 没有占位符代表对象
-
- 如果第一个参数不是格式string :
-
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.
-
- 接受只有1个参数进行检查 ,并始终应用
- node.js REPL :REPL 隐式地用
util.inspect()
语法着色打印任何expression式的返回值 ;
即只要input一个variables的名字,按下Enter就会打印一个检查的值; 例如:-
o = { one: 1, two: 'deux', foo: function(){} } // echoes the object definition with syntax coloring.
-
util.inspect()
自动地(并且总是)漂亮地打印对象和数组表示forms ,但是只在需要的时候才产生多行输出 – 如果所有东西都放在一行上,只打印1行。
-
默认情况下,无论输出是发送到文件还是terminal,输出都包装在60个左右的字符 谢谢Shrey 。 在实践中,因为换行只发生在财产边界 ,所以通常会以较短的行结束,但也可能较长(例如,具有较长的属性值)。
-
在v6.3.0 +中,您可以使用
breakLength
选项来覆盖60个字符的限制; 如果将其设置为Infinity
,则所有内容都将在一行中输出。
如果你想更好地控制漂亮打印 ,可以考虑使用带有第三个参数的JSON.stringify()
,但是请注意以下几点:
- 对于具有循环引用的对象(例如全局上下文中的
module
失败 。 - 方法 (function)将被devise不包括在内。
- 您不能select显示隐藏(不可枚举)的属性。
- 示例调用:
-
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
可以传递一个可选的选项对象来改变格式化string的某些方面:
-
showHidden
- 如果为
true
,那么将显示对象的不可枚举的属性[for keys in obj
或Object.keys(obj)
for keys in obj
时不显示的属性]。 默认为false
。
- 如果为
-
depth
- 在格式化对象时告诉检查多less次recursion。 这对检查大型复杂对象很有用。 默认为2.为了使它无限期递增,传递
null
。
- 在格式化对象时告诉检查多less次recursion。 这对检查大型复杂对象很有用。 默认为2.为了使它无限期递增,传递
-
colors
- 如果为true,则输出将使用ANSI颜色代码进行样式设置。 默认为
false
。 颜色可定制[… – 见链接]。
- 如果为true,则输出将使用ANSI颜色代码进行样式设置。 默认为
-
customInspect
- 如果为
false
,那么定义在被检查对象上的定制inspect()
函数将不会被调用。 默认为true
。
- 如果为
util.format()
格式string占位符 (第一个参数)
来源: http : //nodejs.org/api/util.html#util_util_format_format
-
%s
– string。 -
%d
– 数字(整数和浮点数)。 -
%j
– JSON。 -
%
– 单个百分号('%')。 这不会消耗一个参数。
另一个简单的方法是将其转换为json
console.log('connection : %j', myObject);
也许console.dir
是你所需要的。
http://nodejs.org/api/console.html#console_console_dir_obj
在obj上使用util.inspect并将结果string打印到stdout。
如果你需要更多的控制,使用util选项。
尝试这个:
console.dir(myObject,{depth:null})
你也可以做
console.log(JSON.stringify(myObject, null, 3));
从Node.js 6.4.0开始,可以使用util.inspect.defaultOptions
来优雅地解决这个问题:
require("util").inspect.defaultOptions.depth = null; console.log(myObject);
检查对象的一个好方法是在Chrome DevTools for Node中使用node –inspect选项。
node.exe --inspect www.js
在chrome中打开chrome://inspect/#devices
并点击打开专用的DevTools for Node
现在,每个logging的对象都可以在检查器中使用,就像运行在chrome中的常规JS
不需要重新打开检查器,只要节点启动或重新启动,它就自动连接到节点。 Node和Chrome DevTools for Node都可能不适用于旧版本的Node和Chrome。
您可以简单地将一个inspect()
方法添加到您的对象,这将覆盖console.log
消息中对象的表示forms
例如:
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
作为环境variables
防爆。
DEBUG_DEPTH=null node index.js
在你的代码
const debug = require('debug'); debug("%O", myObject);
节点REPL有一个内置的解决scheme来覆盖如何显示对象,请看这里 。
打印值时,REPL模块在内部使用
util.inspect()
。 但是,util.inspect
将调用委托给对象的inspect()
函数(如果有)。