提问人: 提问时间:5/24/2012 最后编辑:lifeisfoo 更新时间:7/20/2023 访问量:897335
如何在 Node.js 的控制台 .log() 中获取完整的对象,而不是“[对象]”?
How can I get the full object in Node.js's console.log(), rather than '[Object]'?
问:
我有这个对象:
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
答:
您需要使用 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' } } } } }
评论
v0.10.33
console.log()
util.inspect()
util.inspect()
console.log(myObject)
util
console.dir()
v0.11.14
util.inspect()
console.log(obj)
console.log()
util.inspect()
console.dir()
util.inspect()
console.dir()
console.dir(myObject, { depth: null })
console.dir(myObject, { depth: null })
对我有用
你可以使用 JSON.stringify
,并获得一些漂亮的缩进,以及可能更容易记住的语法。
console.log(JSON.stringify(myObject, null, 4));
{
"a": "a",
"b": {
"c": "c",
"d": {
"e": "e",
"f": {
"g": "g",
"h": {
"i": "i"
}
}
}
}
}
第三个参数设置缩进级别,因此您可以根据需要进行调整。
如果需要,请在 JSON 中更详细地字符串化 MDN 文档。
评论
console.log(JSON.stringify(myObject, null, 4));
很酷!https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
另一种简单的方法是将其转换为json
console.log('connection : %j', myObject);
评论
也许这就是你所需要的。console.dir
http://nodejs.org/api/console.html#console_console_dir_obj
在 obj 上使用 util.inspect 并将生成的字符串打印到 stdout。
如果您需要更多控制,请使用 util 选项。
评论
选项
对象传递给 util.inspect
。
util.inspect()
tl;博士
要获得问题中示例的所需输出,请使用 console.dir():
console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion
为什么不呢?因为它已经是诊断输出的核心:并且与 Node.js REPL 一样,隐式使用 util.inspect()。
通常不需要 require('util')
并直接调用 - 除非您想在变量中捕获对象可视化而不是打印到控制台(例如,util.inspect()
console.log()
console.dir()
util.inspect()
let s = util.inspect(myObject, { depth: null })
)
详情如下。
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 ]'
- 请注意,在这种情况下,您不能传递选项,这意味着 2 个值得注意的限制:
util.inspect()
- 输出的结构深度限制为 2 级(默认值)。
- 由于您不能使用 来更改此设置,因此必须改用 :
console.dir(myObject, { depth: null }
打印无限深度;见下文。console.log()
console.dir()
- 由于您不能使用 来更改此设置,因此必须改用 :
- 您无法打开语法着色。
- 输出的结构深度限制为 2 级(默认值)。
- 如果第一个参数是格式字符串(见下文):使用
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
- 没有用于表示对象样式的占位符。
- 如果第一个参数不是格式字符串:
-
- 只接受 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.
- 只接受 1 个参数进行检查,并且始终应用
- 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
true
3
默认情况下,输出以大约 60 个字符的形式包装,谢谢,Shrey ,无论输出是发送到文件还是终端。在实践中,由于换行符只发生在属性边界处,因此通常最终会得到较短的行,但它们也可能更长(例如,属性值较长)。
在 v6.3.0+ 中,您可以使用该选项覆盖 60 个字符的限制;如果将其设置为 ,则所有内容都输出在一行上。
breakLength
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 对象,该对象会更改格式化字符串的某些方面;支持的一些属性包括:
有关当前的完整列表,请参阅最新的 Node.js 文档。
showHidden
- 如果 ,则对象的不可枚举属性 [指定在使用 or 时不显示的属性] 也将显示。缺省值为 .
true
for keys in obj
Object.keys(obj)
false
- 如果 ,则对象的不可枚举属性 [指定在使用 or 时不显示的属性] 也将显示。缺省值为 .
depth
- 告诉检查在格式化对象时递归的次数。这对于检查大型复杂物体很有用。默认值为 2。要使其无限递归,请传递 .
null
- 告诉检查在格式化对象时递归的次数。这对于检查大型复杂物体很有用。默认值为 2。要使其无限递归,请传递 .
colors
- 如果为 true,则输出将使用 ANSI 颜色代码设置样式。缺省值为 .颜色是可自定义的 [... – 见链接]。
false
- 如果为 true,则输出将使用 ANSI 颜色代码设置样式。缺省值为 .颜色是可自定义的 [... – 见链接]。
customInspect
- 如果 ,则不会调用在被检查对象上定义的自定义函数。缺省值为 .
false
inspect()
true
- 如果 ,则不会调用在被检查对象上定义的自定义函数。缺省值为 .
util.format(
) format-string 占位符(第一个参数)
一些支持的占位符包括:
有关当前的完整列表,请参阅最新的 Node.js 文档。
%s
–字符串。%d
– 数字(整数和浮点数)。%j
– JSON格式。%%
– 单百分号 ('%')。这不会消耗参数。
评论
console.dir(...)
show = (v, depth=null)=> console.dir(v,{depth:depth})
show(variable)
show(variable, depth=1)
undefined
也有效:console.dir(myObject, { depth: undefined })
util.inspect()
let s = util.inspect(myObject, { depth: null })
您可以简单地向对象添加一个方法,该方法将覆盖消息中对象的表示形式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 中根据需要表示
更新:
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))
试试这个:
console.dir(myObject,{depth:null})
节点 REPL 有一个内置的解决方案,用于覆盖对象的显示方式,请参阅此处。
REPL 模块在内部使用 ,用于打印值。 但是,将调用委托给对象的函数(如果有)。
util.inspect()
util.inspect
inspect()
你也可以做
console.log(JSON.stringify(myObject, null, 3));
从 Node.js 6.4.0 开始,这可以通过 util.inspect.defaultOptions
优雅地解决:
require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
检查对象的一个好方法是将 node --inspect 选项与 Chrome DevTools for Node 一起使用。
node.exe --inspect www.js
在 chrome 中打开,然后单击“打开专用 DevTools for Node”chrome://inspect/#devices
现在,每个记录的对象都可以在检查器中使用,就像在 chrome 中运行的常规 JS 一样。
无需重新打开检查器,一旦节点启动或重新启动,它就会自动连接到节点。--inspect 和 Chrome DevTools for Node 在旧版本的 Node 和 Chrome 中可能不可用。
评论
node.exe --inspect index.js
一个简单的技巧是在运行脚本时使用模块添加为环境变量debug
DEBUG_DEPTH=null
前任。
DEBUG=* DEBUG_DEPTH=null 节点索引.js
在代码中
const debug = require('debug');
debug("%O", myObject);
评论
这两种用法都可以应用:
// 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));
我认为这可能对你有用。
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
console.log(JSON.stringify(myObject, null, '\t'));
如本答案所述:
JSON.stringify
的第三个参数定义了 漂亮的印刷。它可以是字符串或数字(空格数)。
最简单的选择:
console.log('%O', myObject);
评论
myObject
JSON.stringify()
let myVar = {a: {b: {c: 1}}};
console.log(JSON.stringify( myVar, null, 4 ))
非常适合对数据对象进行深度检查。此方法适用于嵌套数组和具有数组的嵌套对象。
如果你正在寻找一种方法来显示数组中的隐藏项目,你必须通过maxArrayLength: Infinity
console.log(util.inspect(value, { maxArrayLength: Infinity }));
评论
console.dir
使用记录器
不要试图重新发明轮子
util.inspect()
,并且是用于在浏览器控制台中播放时记录对象的有用工具。JSON.stringify()
console.dir()
如果你认真对待 Node.js 开发,你绝对应该使用记录器。使用它,您可以添加用于调试和监视应用程序所需的所有日志。然后,只需更改记录器的日志记录级别,以仅显示生产日志即可。
此外,他们已经解决了与日志记录相关的所有烦人问题,例如:圆形对象、格式、日志级别、多个输出和性能。
使用现代记录器
pino
是一个快速而现代的 Node.js 记录器,它具有合理的默认值来处理循环对象/引用,如 depthLimit
和 edgeLimit
。它支持子记录器、传输和漂亮的打印输出。
此外,它有 8 个默认日志记录级别,您可以使用 customLevels
选项自定义这些级别:
fatal
error
warn
info
debug
trace
silent
安装它
npm install pino
使用它
const logger = require('pino')()
logger.info('hello world')
配置它
const logger = pino({
depthLimit: 10,
edgeLimit: 200,
customLevels: {
foo: 35
}
});
logger.foo('hi')
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
console.log(JSON.stringify(myObject));
输出:
{"a":"a","b":{"c":"c","d":{"e":"e","f":{"g":"g","h":{"i":"i"}}}}}
评论
console.dir
null
console.dir(yourObject, { depth: null });
console.dir
console.dir