1222

When debugging using console.log(), how can I get the full object?

const myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};    
console.log(myObject);

Outputs:

{ a: 'a', b: { c: 'c', d: { e: 'e', f: [Object] } } }

But I want to also see the content of property f.

4

17 回答 17

1896

You need to use util.inspect():

const util = require('util')

console.log(util.inspect(myObject, {showHidden: false, depth: null, colors: true}))

// alternative shortcut
console.log(util.inspect(myObject, false, null, true /* enable colors */))

Outputs

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

See util.inspect() docs.

于 2012-05-23T23:30:34.900 回答
800

您可以使用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

于 2012-05-23T23:42:54.207 回答
554

来自(至少)Node.js v0.10.33(稳定)/ v0.11.14(不稳定)的许多有用答案的汇编,大概通过(至少)v7.7.4(截至此答案的最新更新的最新版本)。向Rory O'Kane 致敬,感谢他的帮助。

tl;博士

要获得问题中示例的所需输出,请使用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 }prints with unlimited depth ; 见下文。
        • 您不能打开语法着色。
    • 如果第一个参数是格式字符串(见下文):用于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使用多行输出,而完全禁用漂亮打印;它也可以设置为一个数字(默认为)来控制有条件的多行行为 - 请参阅文档true3

  • 默认情况下, 无论输出是发送到文件还是终端,输出都包含大约 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()选项对象(第二个参数):

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

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

  • showHidden

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

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

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

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

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

一些受支持的占位符是:

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

  • %s- 细绳。
  • %d– 数字(整数和浮点数)。
  • %j– JSON。
  • %%– 单个百分号 ('%')。这不会消耗一个论点。
于 2014-12-17T20:57:35.160 回答
66

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

console.log('connection : %j', myObject);
于 2014-01-15T16:05:42.843 回答
49

尝试这个:

console.dir(myObject,{depth:null})
于 2015-10-19T11:05:35.227 回答
49

从 Node.js 6.4.0 开始,这可以通过以下方式优雅地解决util.inspect.defaultOptions

require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
于 2017-01-26T20:32:12.350 回答
29

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

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

在 obj 上使用 util.inspect 并将结果字符串打印到标准输出。

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

于 2014-03-02T01:27:02.810 回答
25

这两种用法都可以应用:

// 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));
于 2018-01-11T12:55:25.290 回答
23

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

node.exe --inspect www.js

在 chrome 中打开chrome://inspect/#devices并单击Open dedicated DevTools for Node

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

在此处输入图像描述

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

于 2017-04-17T11:37:29.963 回答
20

你也可以做

console.log(JSON.stringify(myObject, null, 3));
于 2016-02-14T10:32:20.687 回答
13

我认为这可能对你有用。

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

于 2019-06-14T04:28:50.213 回答
5

您可以简单地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 中表示


更新:

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))
于 2015-09-30T12:47:46.510 回答
5

JSON.stringify()

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

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

于 2020-02-19T23:56:11.133 回答
3

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

前任。

DEBUG=* DEBUG_DEPTH=null 节点 index.js

在你的代码中

const debug = require('debug');
debug("%O", myObject);
于 2017-07-27T11:35:47.223 回答
2

最简单的选择:

    console.log('%O', myObject);

于 2019-09-18T13:50:40.390 回答
2

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

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

于 2016-02-11T17:02:16.567 回答
1

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

console.log(util.inspect(value, { maxArrayLength: Infinity }));
于 2020-08-16T11:38:47.640 回答