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

IT技术 javascript node.js debugging console.log
2021-01-26 09:09:35

使用 调试时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] } } }

但我也想看看 property 的内容f

6个回答

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

请参阅util.inspect()文档

不错的解决方案。虽然不需要指定 {showHidden: false},只要它默认为 false。
2021-03-13 09:09:35
@mklement0 我有节点 v5.3.0,当我console.log(obj)仍然为深度嵌套的对象打印 [Object] 时 :( 我真的希望它像你描述的那样表现。
2021-03-13 09:09:35
console.dir(myObject, { depth: null }) 对我有用
2021-03-18 09:09:35
很高兴知道; 不确定它是什么时候引入的,但至少 nodev0.10.33 console.log() 隐式适用util.inspect()于它的参数,假设第一个不是格式字符串。如果您对util.inspect()的默认选项感到满意,那么就console.log(myObject)可以了——不需要 require utilconsole.dir()做同样的事情,但只接受`要检查的对象;至少v0.11.14,您可以将选项对象util.inspect()作为第二个参数传递我的回答有更多细节。
2021-04-07 09:09:35
@SSH:console.log()总是限于2倍的水平(因为它使用util.inspect()的默认情况下没有让你改变它); console.dir()默认情况下具有相同的限制,但您可以传入一个选项对象作为第二个参数来更改它(传递给util.inspect();请注意,console.dir() 一次只能打印1 个对象。要以无限深度打印,请使用console.dir(myObject, { depth: null }).
2021-04-07 09:09:35

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

console.log(JSON.stringify(myObject, null, 4));很酷!https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
2021-03-18 09:09:35
换行和缩进也+1 - 我个人几乎总是需要的
2021-03-23 09:09:35
请注意,您不能使用循环引用JSON.stringify 对象就像它会发生在 DOM 对象上一样,例如。Stringify 将抛出“错误:将循环结构转换为 JSON”。
2021-03-30 09:09:35
这不是完整的对象。仅包含函数的对象将是 {}。当然,这可能是正面的或负面的,具体取决于您要打印的内容。
2021-04-07 09:09:35
在我的情况下,我收到此错误 TypeError: Converting circle structure to JSON
2021-04-08 09:09:35

来自(至少)Node.js v0.10.33(稳定)/ v0.11.14(不稳定)的许多有用答案的汇编,大概是通过(至少)v7.7.4(截至此答案的最新更新的最新版本)。尖帽子的罗里·奥凯恩对他的帮助。

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 }打印见下文。
        • 您无法打开语法着色。
    • 如果第一个参数是格式字符串(见下文):用于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

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

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

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

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

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

一些受支持的占位符是:

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

  • %s - string。
  • %d – 数字(整数和浮点数)。
  • %j – JSON。
  • %%– 单个百分号 ('%')。这不消耗参数。
简化此操作的一种方法是在console.dir(...)没有所有类型的情况下执行一个小的命名函数show = (v, depth=null)=> console.dir(v,{depth:depth})然后像 soshow(variable)一样调用它show(variable, depth=1)
2021-03-11 09:09:35
感谢您提供完整的答案 => 您给出的最佳解决方案:JSON.stringify({ one: 1, two: 'deux',three: true}, undefined, 2);
2021-03-11 09:09:35

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

console.log('connection : %j', myObject);
仍然非常有用,并且可以比要求更快地复制和粘贴到jsonlint.com 中utils:)
2021-03-31 09:09:35
如果对象很小,这非常方便和有用
2021-04-03 09:09:35
不错的技巧,但输出不会被美化,这使得大型对象难以阅读(问题的重点)。
2021-04-07 09:09:35
我认为当你有一个编辑器可以为你格式化 json 时,这个很棒,但你只需要从 REPL 复制它
2021-04-08 09:09:35

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

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