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


890

使用进行调试时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

Answers:


1456

您需要使用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' } } } } }

参见util.inspect()docs


4
不错的解决方案。尽管无需指定{showHidden:false},只要它默认为false。
ecdeveloper 2014年

36
很高兴知道; 不确定何时引入,但至少从第一个节点起v0.10.33 console.log() 隐式地应用于util.inspect()其参数,假设第一个不是格式字符串。如果您对util.inspect()的默认选项感到满意,则只需console.log(myObject)-不需要utilconsole.dir()做同样的事情,但是只接受`检查对象;从至少开始v0.11.14,您可以将options对象util.inspect()作为第二个参数传递;我的答案有更多细节。
mklement0 2014年

4
@ mklement0我有节点V5.3.0,当我console.log(obj)仍然打印[对象]为深度嵌套对象:(我真的希望你描述它会表现。
SSH这

47
@SSH:console.log()总是限于2倍的水平(因为它使用util.inspect()的默认情况下没有让你改变它); console.dir()默认情况下具有相同的限制,但是您可以传入一个options对象作为第二个参数来更改该参数(该参数传递给util.inspect();注意,console.dir() 一次只能打印1个对象。要无限深度打印,请使用console.dir(myObject, { depth: null })
mklement0

13
console.dir(myObject, { depth: null })是为我工作的人
Veck Hsiao

632

您可以使用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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify


2
也+1行和缩进-几乎总是期望我个人
toblerpwn

59
请注意,您不能使用循环引用 JSON.stringify对象。例如,就像DOM对象那样。Stringify将引发“错误:将圆形结构转换为JSON”。
Ignacio Lago 2014年

11
这不是完整的对象。仅包含函数的对象将为{}。当然,取决于您要打印的内容,它可能是肯定的也可能是否定的。
劳伦斯·韦鲁

1
console.log(JSON.stringify(myObject, null, 4));太酷了!https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms

1
就我而言,我收到此错误TypeError:将圆形结构转换为JSON
Prem Sanil

313

大概是通过( 至少)Node.js v0.10.33(稳定)/ v0.11.14(不稳定)的许多有用答案的汇编(v7.7.4此答案的最新更新为当前版本)。向Rory O'Kane求助。

tl; dr

要获得问题示例的所需输出,请使用console.dir()

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

为什么不util.inspect()呢?因为它已经在诊断输出的心脏:console.log()console.dir()以及Node.js的REPL 使用util.inspect() 隐式。它通常没有必要require('util'),并调用util.inspect()直接。

详细信息如下。


  • 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()样式的占位符。
        • 生成的JSON %j的印刷格式不好。
  • 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.
  • REPL使用 语法着色隐式打印任何表达式的返回值util.inspect()
    即,只需输入变量的名称并按Enter键,将打印其值的检查版本;例如:
    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect()自动漂亮地打印对象数组表示,但是仅在需要时才产生多行输出

  • 漂亮的打印行为可以由compact可选options参数中的属性控制。无条件false使用多行输出,而完全禁用漂亮打印;也可以将其设置为一个数字(默认值为)以控制条件多行行为–请参阅docstrue3

  • 默认情况下, 无论输出是发送到文件还是终端,输出都会用大约60个字符包装感谢Shrey。实际上,由于换行仅发生在属性边界处,所以您通常会得到较短的行,但它们也可能更长(例如,具有较长的属性值)。

  • 在v6.3.0 +中,您可以使用该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()选项对象(第二个参数):

可以传递一个可选的options对象,以更改格式化字符串的某些方面;支持的一些属性包括:

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

  • showHidden

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

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

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

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

util.format()格式字符串占位符(第一个参数)

一些受支持的占位符是:

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

  • %s –字符串。
  • %d –数字(整数和浮点数)。
  • %j – JSON。
  • %%–单个百分号('%')。这不消耗参数。

1
简化此操作的一种方法是执行一个小的命名函数,console.dir(...)而无需进行所有键入:show = (v, depth=null)=> console.dir(v,{depth:depth})然后像so show(variable)或那样调用它show(variable, depth=1)
loco.loop

56

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

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

12
不错的技巧,但是输出不会美化,这使得很难读取大型对象(问题的重点)。
Dan Dascalescu 2014年

2
仍然非常有用,并且比需要复制和粘贴到jsonlint.com更快utils:)
SSH

1
我认为当您有一个可以为您设置json格式的编辑器时,这很不错,但是您只需要从REPL中复制出来
即可

2
如果物体很小,这将非常方便且有用
Chinmay Samant 18'Nov




21

你也可以

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

19

检查对象的一种好方法是在Chrome DevTools for Node中使用node --inspect选项。

node.exe --inspect www.js

chrome://inspect/#devices在chrome中打开,然后点击打开Node专用的DevTools

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

在此处输入图片说明

无需重新打开检查器,它会在节点启动或重新启动后立即自动连接到节点。无论--inspect为节点的Chrome DevTools可能无法在旧版本的节点和Chrome浏览器使用。


1
给我的讯息:尝试->node.exe --inspect index.js
寂寞

这应该是最重要的。最佳答案。:)
princebillyGK

11

这两种用法都可以应用:

// 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 values
console.log(JSON.stringify(queryArgs, undefined, 2));

10

我认为这可能对您有用。

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的第三个参数定义用于漂亮打印的空白插入。它可以是字符串或数字(空格数)。


4

您可以简单地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和节点shell中按需要表示


3

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

例如

DEBUG = * DEBUG_DEPTH =空节点index.js

在你的代码

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

@Bala您将需要在项目“ npm install debug --save”中安装“ debug”模块
Chintan

2

REPL节点具有一个内置的解决方案,用于覆盖对象的显示方式,请参见此处

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



0

JSON.stringify()

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.