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

2020/09/19 09:01 · javascript ·  · 0评论

使用进行调试时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

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

您可以使用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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

大概是通过(至少)
来自(至少)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个值得注意的限制:

        • 输出的结构深度限制为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()样式的占位符
        • 生成的JSON %j的印刷格式不好。
  • 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()自动漂亮地打印对象数组表示,但仅在需要时才产生多行输出

  • 漂亮的打印行为可以由compact可选options参数中属性控制无条件false使用多行输出,而完全禁用漂亮打印;也可以将其设置为一个数字(默认值为)以控制条件多行行为–请参阅docstrue3

  • 默认情况下,
    无论输出是发送到文件还是终端
    ,输出都会用
    大约60个字符包装感谢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对象,以更改格式化字符串的某些方面;支持的一些属性包括:

有关最新的完整列表,请参阅最新的Node.js文档

  • showHidden

    • 如果为true,则还将显示对象的不可枚举的属性[使用for keys in obj指定为不显示的属性Object.keys(obj)]。默认为false
  • depth

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

    • 如果为true,则将使用ANSI颜色代码设置输出样式。默认为false颜色是可自定义的[…–参见链接]。
  • customInspect

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

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

一些受支持的占位符是:

有关最新的完整列表,请参阅最新的Node.js文档

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

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

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

试试这个:

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

从Node.js 6.4.0开始,可以使用以下方法优雅地解决此问题util.inspect.defaultOptions

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

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

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

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

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

你也可以

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

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

node.exe --inspect www.js

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

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

在此处输入图片说明

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

这两种用法都可以应用:

// 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的第三个参数定义用于漂亮打印的空白插入。它可以是字符串或数字(空格数)。

您可以简单地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中按需要表示

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

例如

DEBUG = * DEBUG_DEPTH =空节点index.js

在你的代码

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

REPL节点具有一个内置的解决方案,用于覆盖对象的显示方式,请参见此处

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

最简单的选择:

    console.log('%O', 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 }));
本文地址:http://javascript.askforanswer.com/ruhezainode-jsdeconsole-logzhonghuodewanzhengdeduixiangerbushi-object.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!