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

Posted

技术标签:

【中文标题】如何在 Node.js console.log() 中获取完整对象,而不是“[Object]”?【英文标题】:How can I get the full object in Node.js's console.log(), rather than '[Object]'? 【发布时间】:2021-09-13 22:26:51 【问题描述】:

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

【问题讨论】:

请注意,早在 2012 年,这是一个需要解决的问题,但这个问题(很久)已经通过引入 console.dir 得到解决,它采用一个选项对象,让您指定打印深度,null 无限深度:console.dir(yourObject, depth: null );。这个问题的最高投票答案都是在编写时都是很好的答案,但在十年的改进过程中已经过时了。现代答案就是“使用console.dir”。 【参考方案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'     

util.inspect() docs。

【讨论】:

不错的解决方案。虽然不需要指定 showHidden: false 只要它默认为 false。 很高兴知道;不确定何时引入,但至少从节点 v0.10.33 console.log() 隐式util.inspect() 应用于其参数,假设第一个不是格式字符串。如果您对util.inspect() 的默认选项感到满意,只需console.log(myObject) 即可 - 不需要utilconsole.dir() 做同样的事情,但只接受 ` 要检查的对象;至少从v0.11.14 开始,您可以将util.inspect() 的选项对象作为第二个参数传递;我的回答有更多细节。 @mklement0 我有节点 v5.3.0,当我 console.log(obj) 它仍然为深度嵌套的对象打印 [Object] :( 我真的希望它会像你描述的那样运行。 @SSH: console.log() 总是 限制在 2 级别(因为它使用 util.inspect() 的默认值而不允许您更改它); console.dir() 默认情况下具有相同的限制,但您可以传入选项对象作为第二个参数来更改它(传递给 util.inspect();请注意 console.dir() 只能打印 1 i> 一次一个对象。要无限深度打印,请使用console.dir(myObject, depth: null ) console.dir(myObject, depth: null ) 适合我【参考方案2】:

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

【讨论】:

也 +1 换行和缩进 - 几乎总是我个人想要的 请注意,您不能使用 循环引用 对对象进行 JSON.stringify。例如,就像 DOM 对象一样。 Stringify 将抛出“错误:将循环结构转换为 JSON”。 这不是完整的对象。仅包含函数的对象将是 。当然,这可能是正面的或负面的,具体取决于您要打印的内容。 console.log(JSON.stringify(myObject, null, 4)); 很酷! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300 在我的情况下,我收到此错误 TypeError: Converting circular structure to JSON【参考方案3】:

另外一个简单的方法就是转成json

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

【讨论】:

不错的技巧,但输出不会被美化,这使得大对象难以阅读(问题的重点)。 仍然非常有用,而且复制粘贴到jsonlint.com 比需要utils 更快:) 当你有一个可以为你格式化 json 但你只需要从 REPL 复制出来的编辑器时,我认为这个很棒 如果对象很小,这非常方便和有用【参考方案4】:

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

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

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

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

【讨论】:

console.dir is buggy and doesn't yet pass on the options object to util.inspect. 从(至少)v0.11.14 开始,您可以将选项对象作为第二个参数传递给util.inspect()【参考方案5】:

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

tl;dr

要获得问题中示例的所需输出,请使用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(默认)。 由于您无法使用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()-style。 使用%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() // The REPL echoes the object definition with syntax coloring.

util.inspect() 自动漂亮地打印 objectarray 表示,但产生 multiline 输出仅在需要时

漂亮的打印行为可以通过可选的options 参数中的compact 属性来控制; false无条件使用多行输出,而true 完全禁用漂亮打印;它也可以设置为一个数字(默认为3)来控制有条件的多行行为——见the docs。

默认情况下,输出被包装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() 选项对象(第二个参数):

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

查看the latest Node.js docs查看当前的完整列表。

showHidden

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

depth

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

colors

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

customInspect

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

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

一些支持的占位符是:

查看the latest Node.js docs 查看当前的完整列表。

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

【讨论】:

简化此问题的一种方法是执行一个小型命名函数来执行 console.dir(...) 而不输入所有内容:show = (v, depth=null)=> console.dir(v,depth:depth),然后像这样调用它 show(variable)show(variable, depth=1)。跨度> 感谢您提供完整的答案 => 您提供的最佳解决方案:JSON.stringify( one: 1, two: 'deux', three: true, undefined, 2);【参考方案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 和节点 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))

【讨论】:

【参考方案7】:

试试这个:

console.dir(myObject,depth:null)

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

你也可以这样做

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

检查对象的一个​​好方法是将节点 --inspect 选项与 Chrome DevTools for Node 结合使用。

node.exe --inspect www.js

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

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

不需要重新打开inspector,它会在node启动或重启时自动连接到node。 --inspectChrome DevTools for Node 在旧版本的 Node 和 Chrome 中可能不可用。

【讨论】:

给我的消息:试试看 -> node.exe --inspect index.js 这应该在最上面。最佳答案。 :)【参考方案12】:

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

例如

DEBUG=* DEBUG_DEPTH=null node index.js

在你的代码中

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

【讨论】:

@Bala 你需要在你的项目“npm install debug --save”中安装“debug”模块【参考方案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));

【讨论】:

【参考方案14】:

我认为这可能对你有用。

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

【讨论】:

【参考方案15】:

最简单的选择:

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

【讨论】:

这并不能解决将myObject打印到任意深度的问题【参考方案16】:

JSON.stringify()

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

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

【讨论】:

【参考方案17】:

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

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

【讨论】:

以上是关于如何在 Node.js console.log() 中获取完整对象,而不是“[Object]”?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js你如何console.log出一个对象属性+变量?

从弹性beantalk上的docker-compose部署查看node.js日志(console.log)

node.js 的 console.log 是异步的吗?

Node.js console.log 与 console.info

如何防止 Node.js 在等待回调时退出?

没有新行的node.js console.log [重复]