我有这样一个对象:

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' } } } } }

您可以使用JSON。Stringify,并获得一些漂亮的缩进,以及可能更容易记住语法。

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

{
    "a": "a",
    "b": {
        "c": "c",
        "d": {
            "e": "e",
            "f": {
                "g": "g",
                "h": {
                    "i": "i"
                }
            }
        }
    }
}

第三个参数设置缩进级别,因此您可以根据需要进行调整。

如果需要,请在JSON stringify MDN文档中查看更多详细信息。


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

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

也许控制台。Dir就是你所需要的。

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

使用实效。检查obj并将结果字符串打印到标准输出。

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


从Node.js v0.10.33(稳定)/ v0.11.14(不稳定)到(至少)v7.7.4(该答案最新更新的当前版本)的许多有用答案的编译。向罗里·奥凯恩的帮助致敬。

博士tl;

要获得问题中示例所需的输出,请使用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 = {1: 1, 2: 'deux', foo: function(){}};console.log (o,[1、2、3 ]) // -> '{ 一:1、二:“两个”,foo:[功能]}[1,2,3]” 注意,在这种情况下,你不能通过util.inspect()传递选项,这意味着两个值得注意的限制: 输出的结构深度限制为2级(默认值)。 因为你不能用console.log()改变这一点,你必须使用console.dir(): console。dir(myObject, {depth: null}打印无限深度;见下文。 你不能打开语法着色。 如果第一个参数是一个格式字符串(见下文):使用util.format()打印基于格式字符串的其余参数(见下文);例如: O = {1: 1, 2: 'deux', foo: function(){}};console.log (o为JSON: % j, o ) // -> ' o为JSON:{“一”:1、“两个”:两个“}” 注意: 没有占位符来表示util.inspect()样式的对象。 使用%j生成的JSON不是漂亮打印的。 console.dir (): 只接受1个参数来inspect,并且总是应用util.inspect()——本质上,默认情况下,util.inspect()的包装器没有选项;例如: O = {1: 1, 2: 'deux', foo: function(){}};console.dir (o);//实际上与console.log(o)在这种情况下相同。 Node.js v0.11.14+:可选的第二个参数指定了util.inspect()的选项-参见下面;例如: 控制台。Dir ({1: 1, 2: 'deux'}, {colors: true});// Node 0.11+:打印带有语法着色的对象表示。

REPL:使用带有语法着色的util.inspect()隐式打印任何表达式的返回值; 例如,只需输入变量名并按Enter键,就会打印出其值的检查版本;例如: o = {one: 1, two: 'deux', foo: function(){}} // REPL用语法着色回显对象定义。

inspect()自动漂亮地打印对象和数组表示,但只在需要时产生多行输出。

漂亮打印行为可以由可选options参数中的compact属性控制;False无条件地使用多行输出,而true完全禁用漂亮打印;它也可以被设置为一个数字(默认值是3)来控制有条件的多行行为——参见文档。 默认情况下,输出大约60个字符谢谢,Shrey ,不管输出是发送到文件还是终端。在实践中,由于换行只发生在属性边界处,因此您通常会得到较短的行,但它们也可以更长(例如,具有较长的属性值)。 在v6.3.0+中,您可以使用breakLength选项来覆盖60个字符的限制;如果你将它设置为Infinity,所有内容都将输出到一行中。

如果你想对漂亮打印有更多的控制,可以考虑使用带有第三个参数的JSON.stringify(),但请注意以下内容:

对于具有循环引用的对象失败,例如全局上下文中的module。 方法(函数)将被设计不包括在内。 不能选择显示隐藏的(不可枚举的)属性。 示例调用: JSON。Stringify({一:1,二:'deux',三:true},未定义,2);//创建一个漂亮打印的多行JSON表示,缩进2个空格


inspect()选项对象(第二个参数):

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

查看最新的Node.js文档了解当前完整的列表。

showHidden 如果为真,则对象的不可枚举属性[当你在obj或object .keys(obj)中使用键时指定不显示的属性]也将显示。默认为false。 深度 告诉检查在格式化对象时要递归多少次。这对于检查大型复杂对象非常有用。默认值为2。为了使它无限递归,传递null。 颜色 如果为真,则输出将使用ANSI颜色代码进行样式化。默认为false。颜色可定制[…-见链接]。 customInspect 如果为false,则不会调用在被检查对象上定义的自定义inspect()函数。默认为true。


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

一些受支持的占位符是:

查看最新的Node.js文档了解当前完整的列表。

%s -字符串。 %d -数字(整数和浮点数)。 %j - JSON。 %% -单个百分号(' % ')。这并不消耗一个论点。


您可以简单地向对象添加一个inspect()方法,该方法将覆盖console.log消息中的对象表示

eg:

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


更新:

对象。Inspect已弃用(https://github.com/nodejs/node/issues/15549)。使用myObject [util.inspect。自定义):

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()。 然而,实效。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://inspect/#设备,单击Open dedicated DevTools for Node

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

不需要重新打开检查器,只要节点启动或重启,它就自动连接到节点。——inspect和Chrome DevTools for Node可能在旧版本的Node和Chrome中不可用。


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

Ex.

DEBUG=* DEBUG_DEPTH=null节点index.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 = { “一”:“一”, " b ": { “c”:“c”, " d ": { “e”:“e”, " f ": { “g”:“g”, " h ": { “我”:“我” } } } } }; console.log (JSON。stringify(myObject, null, '\t'));

如本回答所述:

JSON。Stringify的第三个参数定义了空格插入 打印格式。它可以是字符串或数字(空格数)。


简单的选择:

console.log ' % ', 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 }));

使用记录器

不要试图重新发明轮子

util.inspect(), JSON.stringify()和console.dir()是在浏览器控制台中播放时记录对象的有用工具。

如果你认真对待Node.js开发,你绝对应该使用记录器。使用它,您可以添加调试和监视应用程序所需的所有日志。然后只需更改日志记录器的日志级别,以只显示生产日志。

此外,他们已经解决了所有与日志相关的恼人问题,如:循环对象,格式,日志级别,多个输出和性能。

使用现代的记录器

pino是一个快速和现代的Node.js日志记录器,它有正常的默认值来处理循环对象/引用,如depthLimit和edgeLimit。它支持子日志记录器、传输和漂亮的打印输出。

此外,它有8个默认的日志级别,你可以使用customLevels选项自定义:

致命的 错误 警告 信息 调试 跟踪 沉默

安装它

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"}}}}}