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

问题描述 投票:714回答:14

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

javascript node.js debugging console.log
14个回答
1197
投票

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


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));

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中按需要表示


3
投票

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

防爆。

DEBUG = * DEBUG_DEPTH = null节点index.js

在你的代码中

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

2
投票

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

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


1
投票

我认为它对你有用。

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

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

536
投票

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


235
投票

来自(至少)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个显着的限制: 输出的结构深度限制为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。
  • % - 单个百分号('%')。这不会消耗参数。

49
投票

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

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

35
投票

试试这个:

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

22
投票

从Node.js 6.4.0开始,可以使用util.inspect.defaultOptions优雅地解决这个问题:

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

18
投票

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

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

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

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


18
投票

你也可以

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

13
投票

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

node.exe --inspect www.js

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

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

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.