如何在Node.js的console.log()中获取完整的对象,而不是'[Object]'?

我有这个对象:

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的内容?

777965 次浏览

您需要使用#0

const util = require('util')
console.log(util.inspect(myObject, {showHidden: false, depth: null, colors: true}))
// alternative shortcutconsole.log(util.inspect(myObject, false, null, true /* enable colors */))

产出

{ a: 'a',  b: { c: 'c', d: { e: 'e', f: { g: 'g', h: { i: 'i' } } } } }

您可以使用JSON.stringify,并获得一些漂亮的缩进,也许更容易记住语法。

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

{"a": "a","b": {"c": "c","d": {"e": "e","f": {"g": "g","h": {"i": "i"}}}}}

第三个参数设置缩进级别,因此您可以根据需要进行调整。

如果需要,请参阅JSON字符串化MDN文档

另一个简单的方法是将其转换为json

console.log('connection : %j', myObject);

也许console.dir就是你所需要的。

http://nodejs.org/api/console.html#console_console_dir_obj

在obj上使用util.inspect并将结果字符串打印到stdout。

如果您需要更多控制,请使用util选项。

从(至少)Node.jsv0.10.33(稳定)/v0.11.14(不稳定)到(至少)v7.7.4(此答案最新更新的当前版本)的许多有用答案的汇编。向罗里·奥凯恩致敬,感谢他的帮助。

tl; dr

要获得问题中示例的所需输出,请使用#0

console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion

为什么不是util.inspect()?因为它已经是诊断输出的核心:console.log()console.dir()以及Node.jsREPL使用#0隐式。它通常是不需要#4并直接调用util.inspect()

详情如下。


  • #0(及其别名#1):

    • 如果第一个参数不是格式字符串#0自动应用于每个参数:
      • 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个级别(默认值)。
          • 因为你不能用console.log()改变它,你必须使用console.dir()#2打印,无限深度;见下文。
        • 无法启用语法着色。
    • 如果第一个参数是格式字符串(见下文):使用#0根据格式字符串打印剩余的参数(见下文);例如:
      • 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不是漂亮打印的。
  • #0

    • 只接受1参数进行检查,并始终应用#0-本质上是util.inspect()的包装器,默认情况下没有选项;例如:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.dir(o); // Effectively the same as console.log(o) in this case.
    • Node.jsv0.11.14+:可选的第二个参数指定选项#0-见下文;例如:
      • console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
  • REPL使用#0语法着色隐式打印任何表达式的返回值
    即,只需键入变量的名称并点击回车键就会打印出其值的检查版本;例如:
    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

#0自动美化打印对象数组表示,但产生多行仅在需要时输出

  • 漂亮打印行为可以由可选的options参数中的compact属性控制;false无条件地使用多行输出,而true完全禁用漂亮打印;它也可以设置为数字(默认值为3)来控制有条件的多行行为-请参阅文档中的

  • 默认情况下,输出被包装约60个字符谢谢,Shrey,无论输出是发送到文件还是终端。在实践中,从分界线只发生在房产边界开始,您通常会以较短的行结束,但它们也可以更长(例如,具有长属性值)。

  • 在v6.3.0+中,您可以使用breakLength选项覆盖60个字符的限制;如果您将其设置为Infinity,则所有内容都在单行上输出。

如果你想更好地控制漂亮的打印,考虑使用#0,但请注意以下内容:

  • 失败具有循环引用的对象,例如全局上下文中的module
  • 方法(函数)在设计上将不包括在内。
  • 不能选择显示隐藏(不可枚举)属性。
  • 示例调用:
    • JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces

#0选项对象(第二个参数):

可以传递一个可选的选项对象来改变格式化字符串的某些方面;一些支持的属性是:

有关当前完整列表,请参阅最新的Node.js文档。

  • showHidden

    • 如果true,则对象的不可枚举属性[那些指定在使用for keys in objObject.keys(obj)时不显示的属性]也将显示。默认为false
  • depth

    • 告诉检查在格式化对象时递归多少次。这对于检查大型复杂对象很有用。默认为2。要使其无限期递归,请传递null
  • colors

    • 如果为true,则输出将使用ANSI颜色代码设置样式。默认为false。颜色可自定义[…-请参阅链接]。
  • customInspect

    • 如果false,则不会调用在被检查对象上定义的自定义inspect()函数。默认为true

#0格式字符串占位符(第一个参数)

一些支持的占位符是:

有关当前完整列表,请参阅最新的Node.js文档。

  • %s-字符串。
  • %d-数字(整数和浮点数)。
  • %j-JSON。
  • %%-百分号 (‘%’). 这不会消耗参数。

您可以简单地向您的对象添加inspect()方法,它将覆盖console.log消息中对象的表示

eg:

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和节点shell中表示


更新时间:

object.inspect已被弃用(https://github.com/nodejs/node/issues/15549)。请使用myObject[util.inspect.custom]:

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.dir(myObject,{depth:null})

节点REPL有一个内置的解决方案来覆盖对象的显示方式,请参阅这里

当打印值时,REPL模块在内部使用util.inspect()。但是,util.inspect将调用委托给对象的inspect()函数,如果它有一个。

你也可以做

console.log(JSON.stringify(myObject, null, 3));

从Node.js6.4.0开始,这可以用#0优雅地解决:

require("util").inspect.defaultOptions.depth = null;console.log(myObject);

检查对象的一个好方法是将节点--检查选项与ChromeDevTools for Node一起使用。

node.exe --inspect www.js

在chrome中打开chrome://inspect/#devices并单击为Node打开专用DevTools

现在,每个记录的对象都可以在检查器中使用,就像在chrome中运行的常规JS一样。

在此处输入图片描述

无需重新打开检查器,它会在节点启动或重新启动时自动连接到节点。--检查ChromeDevTools for Node在旧版本的Node和Chrome中可能不可用。

一个简单的技巧是使用debug模块在运行脚本时添加DEBUG_DEPTH=null作为环境变量

前。

DEBUG=*DEBUG_DEPTH=空节点index.js

在你的代码

const debug = require('debug');debug("%O", myObject);

这两种用法都可以应用:

// more compact, and colour can be applied (better for process managers logging)console.dir(queryArgs, { depth: null, colors: true });
// get a clear list of actual valuesconsole.log(JSON.stringify(queryArgs, undefined, 2));

我想这可能对你有用。

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('%O', myObject);

JSON.stringify()

let myVar = {a: {b: {c: 1}}};console.log(JSON.stringify( myVar, null, 4 ))

非常适合深度检查数据对象。这种方法适用于嵌套数组和带有数组的嵌套对象。

如果你正在寻找一种方法来显示数组中隐藏的项目,你必须通过maxArrayLength: Infinity

console.log(util.inspect(value, { maxArrayLength: Infinity }));

使用记录器

不要试图重新发明轮子

util.inspect()JSON.stringify()console.dir()是在浏览器控制台中播放时记录对象的有用工具。

如果你是严重关于Node.js开发,你绝对应该使用一个记录器。使用它,你可以添加所有你想要的日志调试和监控你的应用程序。然后只是更改日志记录级别你的记录器只保留生产日志可见

此外,他们已经解决了所有与日志相关的恼人问题,例如:圆形物体格式化、log水平、多个产出性能

使用现代记录仪

#0是一个快速和现代的Node.js记录器,它具有正常的默认值来处理#1#2等循环对象/引用。它支持儿童记录器运输非常印刷输出。

此外,它有8个默认日志记录级别,您可以使用#0选项进行自定义:

  • fatal
  • error
  • warn
  • info
  • debug
  • trace
  • silent

安装它

npm install pino

用它

const logger = require('pino')()
logger.info('hello world')

配置它

const logger = pino({depthLimit: 10,edgeLimit: 200,customLevels: {foo: 35}});
logger.foo('hi')
const myObject = {"a":"a","b":{"c":"c","d":{"e":"e","f":{"g":"g","h":{"i":"i"}}}}};console.log(JSON.stringify(myObject));

输出:

{"a":"a","b":{"c":"c","d":{"e":"e","f":{"g":"g","h":{"i":"i"}}}}}