如何在 Node.js 的控制台 .log() 中获取完整的对象,而不是“[对象]”?

How can I get the full object in Node.js's console.log(), rather than '[Object]'?

提问人: 提问时间:5/24/2012 最后编辑:lifeisfoo 更新时间:7/20/2023 访问量:897335

问:

我有这个对象:

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

JavaScript 节点 .js 调试 控制台 .log

评论

103赞 Mike 'Pomax' Kamermans 9/12/2021
请注意,早在 2012 年,这是一个需要解决的问题,但随着 的引入,这个问题(早已)得到解决,它采用一个选项对象,该对象允许您指定打印深度,并具有无限深度:。这个问题得票最高的答案在写的时候都是很好的答案,但经过十年的改进,已经过时了。现代的答案很简单“使用”。console.dirnullconsole.dir(yourObject, { depth: null });console.dir
1赞 Devin Rhode 8/22/2023
我想 StackOverflow 用户的最佳实践是,如果问题足够旧,请使用“排序依据:修改日期(最新优先)”。来自 mklement0 的答案还建议使用console.dir

答:

2184赞 250R 5/24/2012 #1

您需要使用 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 */))

输出

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

评论

9赞 ecdeveloper 12/5/2014
不错的解决方案。虽然不需要指定 {showHidden: false},只要它默认为 false。
64赞 mklement0 12/18/2014
很高兴知道;不确定它是什么时候引入的,但至少 node 隐地应用于它的参数,假设第一个不是格式字符串。如果您对默认选项感到满意,只需执行 - 无需要求; 做同样的事情,但只接受 ' 对象进行检查;至少从现在开始,你可以将 选项对象作为第二个参数传递;我的回答有更多细节。v0.10.33console.log()util.inspect()util.inspect()console.log(myObject)utilconsole.dir()v0.11.14util.inspect()
13赞 SSH This 2/24/2016
@mklement0我有节点 v5.3.0,当我仍然为深度嵌套的对象打印 [Object] 时:(我真的希望它能像你描述的那样运行。console.log(obj)
108赞 mklement0 2/24/2016
@SSH:总是限制在 2 个级别(因为它使用 的默认值,而不允许你更改它); 默认情况下具有相同的限制,但您可以传入一个 options 对象作为第二个参数来更改它(该参数传递到 ;请注意,一次只能打印 1 个对象。要以无限深度打印,请使用 .console.log()util.inspect()console.dir()util.inspect()console.dir()console.dir(myObject, { depth: null })
64赞 Veck Hsiao 4/26/2017
console.dir(myObject, { depth: null })对我有用
954赞 4 revs, 4 users 85%user1106925 #2

你可以使用 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 文档

评论

5赞 toblerpwn 7/7/2013
换行符和缩进也为 +1 - 我个人几乎总是想要的
81赞 Ignacio Lago 1/18/2014
请注意,您不能使用循环引用对对象进行 JSON.stringify。例如,就像 DOM 对象一样。Stringify 将抛出“错误:将循环结构转换为 JSON”。
16赞 Lawrence Weru 12/23/2015
这不是完整的对象。仅包含函数的对象将是 {}。当然,这可能是积极的或消极的,这取决于你想打印出来什么。
4赞 xgqfrms 6/13/2017
console.log(JSON.stringify(myObject, null, 4));很酷!https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
3赞 Константин Ван 1/27/2020
它失去了颜色。
72赞 niksmac 1/16/2014 #3

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

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

评论

16赞 Dan Dascalescu 8/2/2014
不错的技巧,但输出不会被美化,这使得大型对象难以阅读(问题的重点)。
4赞 SSH This 2/24/2016
仍然非常有用,并且比需要:)更快地复制并粘贴到 jsonlint.comutils
1赞 jcollum 12/13/2017
我认为当你有一个可以为你格式化json的编辑器时,这个很棒,但你只需要从REPL中复制它
2赞 Chinmay Samant 11/9/2018
如果对象很小,这将非常方便和有用
29赞 Luke W 3/2/2014 #4

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

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

在 obj 上使用 util.inspect 并将生成的字符串打印到 stdout。

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

评论

1赞 mklement0 12/18/2014
从(至少)v0.11.14 开始,您可以将 options 对象作为第二个参数传递,该参数传递给 。util.inspect()
789赞 mklement0 12/18/2014 #5
从(至少)Node.js 'v0.10.33'(稳定)/“v0.11.14”(不稳定)到(至少)“v7.7.4”(截至此答案的最新更新的当前版本)的许多有用答案的汇编。向 [Rory O'Kane](https://stackoverflow.com/users/578288/rory-okane) 的帮助致敬。

tl;博士

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

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

为什么不呢?因为它已经是诊断输出的核心:并且与 Node.js REPL 一样,隐式使用 util.inspect()。通常不需要 require('util') 并直接调用 - 除非您想在变量中捕获对象可视化而不是打印到控制台(例如,util.inspect()console.log()console.dir()util.inspect()let s = util.inspect(myObject, { depth: null }))

详情如下。


  • 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 ]'
      • 请注意,在这种情况下,您不能传递选项,这意味着 2 个值得注意的限制:util.inspect()
        • 输出的结构深度限制为 2(默认值)。
          • 由于您不能使用 来更改此设置,因此必须改用 : console.dir(myObject, { depth: null } 打印无限深度;见下文。console.log()console.dir()
        • 您无法打开语法着色。
    • 如果第一个参数是格式字符串(见下文):使用 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() 会自动漂亮地打印对象数组表示,但仅在需要时生成多行输出

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

  • 默认情况下,输出以大约 60 个字符的形式包装,谢谢,Shrey无论输出是发送到文件还是终端。在实践中,由于换行符只发生在属性边界处,因此通常最终会得到较短的行,但它们也可能更长(例如,属性值较长)。

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

如果您想更好地控制漂亮打印,请考虑使用带有第三个参数的 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

    • 如果 ,则对象的不可枚举属性 [指定在使用 or 时不显示的属性] 也将显示。缺省值为 .truefor keys in objObject.keys(obj)false
  • depth

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

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

    • 如果 ,则不会调用在被检查对象上定义的自定义函数。缺省值为 .falseinspect()true

util.format() format-string 占位符(第一个参数)

一些支持的占位符包括:

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

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

评论

3赞 loco.loop 5/2/2020
简化这一点的一种方法是做一个小的命名函数,无需所有键入:然后像 so 或 .console.dir(...)show = (v, depth=null)=> console.dir(v,{depth:depth})show(variable)show(variable, depth=1)
1赞 Deunz 3/17/2021
感谢您的完整答案=>您给出的最佳解决方案:JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2);
1赞 Nicolas Bouvrette 8/9/2022
undefined也有效:console.dir(myObject, { depth: undefined })
0赞 theonlygusti 7/20/2023
如何将 console.dir 输出保存到字符串中?
0赞 mklement0 7/20/2023
@theonlygusti,使用,例如;我还用这些信息更新了答案。util.inspect()let s = util.inspect(myObject, { depth: null })
8赞 harish2704 9/30/2015 #6

您可以简单地向对象添加一个方法,该方法将覆盖消息中对象的表示形式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 和 Node 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))
66赞 hirra 10/19/2015 #7

试试这个:

console.dir(myObject,{depth:null})
2赞 Lloyd 2/12/2016 #8

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

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

21赞 Eesa 2/14/2016 #9

你也可以做

console.log(JSON.stringify(myObject, null, 3));
74赞 silverwind 1/27/2017 #10

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

require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
26赞 Ali 4/17/2017 #11

检查对象的一个好方法是将 node --inspect 选项与 Chrome DevTools for Node 一起使用。

node.exe --inspect www.js

在 chrome 中打开,然后单击“打开专用 DevTools for Nodechrome://inspect/#devices

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

enter image description here

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

评论

1赞 3/10/2019
给我的消息:试试看->node.exe --inspect index.js
2赞 Prince Billy Graham 4/12/2020
这应该在上面。最佳答案。:)
4赞 Chintan 7/27/2017 #12

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

前任。

DEBUG=* DEBUG_DEPTH=null 节点索引.js

在代码中

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

评论

2赞 Chintan 11/18/2017
@Bala 您需要在项目“npm install debug --save”中安装“debug”模块
32赞 Erce 1/11/2018 #13

这两种用法都可以应用:

// 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));
13赞 Nirav Sutariya 6/14/2019 #14

我认为这可能对你有用。

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

3赞 Sunil Jamkatel 9/18/2019 #15

最简单的选择:

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

评论

2赞 Gershom Maes 10/8/2019
这并不能解决打印到任意深度的问题myObject
8赞 Stephen Blum 2/20/2020 #16

JSON.stringify()

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

非常适合对数据对象进行深度检查。此方法适用于嵌套数组和具有数组的嵌套对象。

5赞 Lukas 8/16/2020 #17

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

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

评论

0赞 jpoppe 2/27/2022
也适用于 .console.dir
9赞 lifeisfoo 4/10/2022 #18

使用记录器

不要试图重新发明轮子

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

如果你认真对待 Node.js 开发,你绝对应该使用记录器。使用它,您可以添加用于调试和监视应用程序所需的所有日志。然后,只需更改记录器的日志记录级别,以仅显示生产日志即可

此外,他们已经解决了与日志记录相关的所有烦人问题,例如:圆形对象格式、日志级别、多个输出性能

使用现代记录器

pino 是一个快速而现代的 Node.js 记录器,它具有合理的默认值来处理循环对象/引用,如 depthLimitedgeLimit。它支持子记录器传输漂亮的打印输出。

此外,它有 8 个默认日志记录级别,您可以使用 customLevels 选项自定义这些级别:

  • 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')
4赞 Manu Rastogi 11/4/2022 #19
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"}}}}}

评论

0赞 Offirmo 6/26/2023
警告:JSON.stringify 有限制: - 无法显示所有变量类型:函数、符号、BigInt... - 循环引用时崩溃