我怎样才能得到完整的对象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() ):

    • 如果第一个参数不是格式stringutil.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 }打印无限深度 ;见下面。
        • 你不能把语法着色。
    • 如果第一个参数是一个格式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不是非常漂亮的。
  • 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.
  • 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 objObject.keys(obj) for keys in obj时不显示的属性]。 默认为false
  • depth
    • 在格式化对象时告诉检查多less次recursion。 这对检查大型复杂对象很有用。 默认为2.为了使它无限期递增,传递null
  • colors
    • 如果为true,则输出将使用ANSI颜色代码进行样式设置。 默认为false 。 颜色可定制[… – 见链接]。
  • 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

在这里输入图像描述

不需要重新打开检查器,只要节点启动或重新启动,它就自动连接到节点。 NodeChrome 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()函数(如果有)。