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

时间:2012-05-23 23:29:28

标签: javascript node.js debugging console.log

使用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的内容。

17 个答案:

答案 0 :(得分:1172)

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

答案 1 :(得分:528)

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

答案 2 :(得分:230)

来自(至少)Node.js v0.10.33(稳定)/ v0.11.14(不稳定)的许多有用答案的汇编,大概是通过(至少)v7.7.4(当前的版本当前版本)这个答案的最新更新)。

<强> TL;博士

util.inspect()是诊断输出的核心: console.log()console.dir()以及Node.js REPL隐式使用util.inspect() ,因此 require('util')直接致电util.inspect() 通常

要获得问题中示例的所需输出:

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

详情如下。


  • 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 级别(默认值)。
          • 由于您无法使用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() - 样式。
        • 使用%j生成的JSON并不是很漂亮。
  • <强> 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(){} } // echoes the object definition with syntax coloring.

util.inspect()自动(并且总是)漂亮地打印对象数组表示,但会产生 仅在需要时输出多行 - 如果所有内容都适合一行,则只打印一行。

  • 默认情况下,输出被包裹at around 60 characters 谢谢,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()选项对象(第二个参数):

来源:http://nodejs.org/api/util.html#util_util_format_format

可以传递一个可选的选项对象,它会改变格式化字符串的某些方面:

  • showHidden
    • 如果true,则会显示对象的不可枚举属性[指定在您使用for keys in objObject.keys(obj)时不显示的属性]。默认为false
  • depth
    • 告诉我们在格式化对象时检查递归的次数。这对于检查大型复杂对象很有用。默认为2.要使其无限递归,请传递null
  • colors
    • 如果为true,则输出将使用ANSI颜色代码进行样式设置。默认为false。颜色可自定义[... - 请参阅链接]。
  • customInspect
    • 如果false,那么在被检查对象上定义的自定义inspect()函数将无法调用。默认为true

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

来源:http://nodejs.org/api/util.html#util_util_format_format

  • %s - 字符串。
  • %d - 数字(包括整数和浮点数)。
  • %j - JSON。
  • % - 单个百分号(&#39;%&#39;)。这不会消耗论据。

答案 3 :(得分:48)

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

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

答案 4 :(得分:35)

试试这个:

console.dir(myObject,{depth:null})

答案 5 :(得分:21)

自Node.js 6.4.0以来,util.inspect.defaultOptions可以很好地解决这个问题:

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

答案 6 :(得分:18)

您也可以

string[] receive = receiveattachment.Split(new char[] { ',' });//{1,0,1,0}
string[] display = isdisplaytotal.Split(new char[] { ',' });//{1,1,1,0}
string[] ccTemp = cc.Split(new char[] { ',' });//{a@gmail.com, b@gmail.com, c@gmail.com, d@gmail.com}

答案 7 :(得分:17)

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

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

  

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

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

答案 8 :(得分:13)

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

node.exe --inspect www.js

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

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

enter image description here

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

答案 9 :(得分:10)

这两种用法都可以应用

// more compact and colour can be applied (better for process managers logging)

console.dir(queryArgs, { depth: null, colors: true });

// clear list of actual values

console.log(JSON.stringify(queryArgs, undefined, 2));

答案 10 :(得分: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和node shell

中表示为必需

答案 11 :(得分:3)

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

实施例

DEBUG = * DEBUG_DEPTH = null node index.js

在你的代码中

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

答案 12 :(得分:3)

我认为这可能对您有用。

const myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};

console.log(JSON.stringify(myObject, null, '\t'));

this answer中所述:

  

JSON.stringify的第三个参数定义了空格插入   精美印刷。它可以是字符串或数字(空格数)。

答案 13 :(得分:2)

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

  

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

答案 14 :(得分:2)

最简单的选择:

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

答案 15 :(得分:1)

JSON.stringify()

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

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

答案 16 :(得分:0)

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

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