如何在 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)
即可 - 不需要util
; console.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 theoptions
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()
:
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()
自动漂亮地打印 object 和 array 表示,但产生 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 obj
或Object.keys(obj)
时指定不显示的属性]也会被显示。默认为false
。
depth
null
。
colors
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。 --inspect 和 Chrome 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)