Как я могу получить полный объект в Node.js console.log (), а не в '[Object]'?

При отладке с использованием 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.


person Community    schedule 23.05.2012    source источник


Ответы (17)


Вам нужно использовать 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.

person 250R    schedule 23.05.2012
comment
Хорошее решение. Хотя нет необходимости указывать {showHidden: false}, если по умолчанию установлено значение false. - person ecdeveloper; 05.12.2014
comment
Хорошо знать; не уверен, когда он был введен, но, по крайней мере, узел v0.10.33 console.log() неявно применяет util.inspect() к своим аргументам, предполагая, что 1-й не является строкой формата. Если вас устраивают параметры util.inspect() по умолчанию, подойдет просто console.log(myObject) - требовать util не нужно; console.dir() делает то же самое, но принимает только `объект для проверки; как минимум с v0.11.14, вы можете передать объект параметров для util.inspect() в качестве 2-го аргумента; в моем ответе есть более подробные сведения. - person mklement0; 18.12.2014
comment
Исправление к моему предыдущему комментарию: console.dir() делает то же самое, но принимает только `объект для проверки, который должен был быть ... принимает только один объект для проверки. - person mklement0; 07.03.2015
comment
Если он вам нужен для генераторов и используйте вывод в коде: Будьте осторожны: кажется, что util.inspect не цитирует конфиденциальные Object.keys. Протестировано с {in: 'i'} - person sebilasse; 07.06.2015
comment
@ mklement0 У меня есть узел v5.3.0, и когда я console.log(obj) он все еще печатает [Object] для глубоко вложенных объектов :( Я действительно хочу, чтобы он вел себя так, как вы описываете. - person SSH This; 24.02.2016
comment
@SSH: console.log() неизменно ограничен 2 уровнями (потому что он использует значение по умолчанию util.inspect(), не позволяя вам его изменять); console.dir() имеет такое же ограничение по умолчанию, но вы можете передать объект параметров в качестве второго аргумента, чтобы изменить его (который передается в util.inspect(); обратите внимание, что console.dir() может печатать только 1 объект за раз Однако для печати с неограниченной глубиной используйте console.dir(myObject, { depth: null }). - person mklement0; 24.02.2016
comment
Как я могу использовать console.log () в клиентской консоли, сделав его сворачиваемым? Я имею в виду функцию сворачивания / разворачивания, чтобы открыть, закрыть ее дочерние элементы - person neoDev; 09.05.2016
comment
однозначно util.inspect - правильное решение. Смотрите здесь все варианты, стили и цвета! nodejs.org/api/util.html#util_util_inspect_object_options - person loretoparisi; 16.11.2016
comment
console.dir(myObject, { depth: null }) это работа для меня - person Veck Hsiao; 26.04.2017
comment
У @VeckHsiao лучший комментарий, и он находится в ответе сообщества ниже. console.dir(myObject, { depth: 4, colors: true }, например, это то, что я использую. Проще, чем util.inspect, и имеет тот же результат с сохранением небольших объектов / массивов в одной строке и указанием имен классов, ссылок на функции с их именами и т. Д.) И подсветкой синтаксиса ... - person Jason Goemaat; 06.03.2018
comment
Это отличный вариант для AWS CloudWatch, который имеет тенденцию разбивать console.dir и другие регистраторы на отдельные строки, чего не делает для console.log. - person LordParsley; 19.03.2020
comment
@VeckHsiao: console.dir(mongooseObject, { depth: null }) печатает намного меньше, чем console.log(util.inspect(mongooseObject, {depth: null})), поэтому они не всегда эквивалентны. - person Dan Dascalescu; 27.05.2020

Вы можете использовать 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

person Community    schedule 23.05.2012
comment
также +1 для разрывов строк и отступов - почти всегда желанный лично для меня - person toblerpwn; 07.07.2013
comment
Обратите внимание, что вы не можете JSON.stringify объекты с циклическими ссылками. Как, например, это происходит с объектами DOM. Stringify выдаст ошибку: преобразование круговой структуры в JSON. - person Ignacio Lago; 17.01.2014
comment
это не полный объект. объекты, содержащие только функции, будут {}. Конечно, это может быть положительно или отрицательно, в зависимости от того, что вы хотите распечатать. - person Lawrence Weru; 23.12.2015
comment
@IgnacioLago Так как же выходить из этой ситуации? - person 1252748; 08.01.2016
comment
JSON.stringify в порядке, но учтите, что это работает только со структурами json. Если вы хотите вывести объект javascript, это не сработает во всех случаях, в то время как util.inspect будет. Кроме того, чтобы избежать ...more items файла console.log, вам нужно передать util.inspect параметр { maxArrayLength: 1000 }, чтобы в любом случае распечатать до 1000 элементов. - person loretoparisi; 16.11.2016
comment
console.log(JSON.stringify(myObject, null, 4)); довольно круто! https://gist.github.com/xgqfrms-GitHub/92aaa2b00241 - person xgqfrms; 13.06.2017
comment
В моем случае я получаю эту ошибку TypeError: преобразование круговой структуры в JSON - person Prem Sanil; 30.01.2019
comment
Он теряет свой цвет. - person Константин Ван; 26.01.2020

Подборка множества полезных ответов от (как минимум) Node.js v0.10.33 (стабильный) / v0.11.14 (нестабильный), предположительно, до (как минимум) v7.7.4 (текущая версия на момент последнего обновления этого ответа). Совет перед Рори О'Кейну за его помощь.

tl; dr

Чтобы получить желаемый результат для примера в вопросе, используйте console.dir():

console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion

Почему не util.inspect()? Потому что он уже лежит в основе диагностического вывода: console.log() и console.dir(), а также REPL для Node.js используют util.inspect() неявно. Обычно нет необходимости require('util') и напрямую звонить util.inspect().

Подробности ниже.


  • console.log() (и его псевдоним _ 13_):

    • If the 1st argument is NOT a format string: util.inspect() is automatically applied to every argument:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
      • Note that you cannot pass options through util.inspect() in this case, which implies 2 notable limitations:
        • Structural depth of the output is limited to 2 levels (the default).
          • Since you cannot change this with console.log(), you must instead use console.dir(): console.dir(myObject, { depth: null } prints with unlimited depth; see below.
        • Вы не можете включить подсветку синтаксиса.
    • If the 1st argument IS a format string (see below): uses util.format() to print the remaining arguments based on the format string (see below); e.g.:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
      • Note:
        • There is NO placeholder for representing objects util.inspect()-style.
        • JSON, созданный с помощью %j, НЕ является красивым.
  • console.dir():

    • Accepts only 1 argument to inspect, and always applies util.inspect() – essentially, a wrapper for util.inspect() without options by default; e.g.:
      • 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+: The optional 2nd argument specifies options for util.inspect() – see below; e.g.:
      • console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
  • The REPL: implicitly prints any expression's return value with util.inspect() with syntax coloring;
    i.e., just typing a variable's name and hitting Enter will print an inspected version of its value; e.g.:
    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect() автоматически распечатывает объект и массив представлений, но выводит многострочный вывод только при необходимости.

  • Поведение красивой печати можно контролировать с помощью свойства compact в необязательном аргументе options; false использует многострочный вывод безусловно, тогда как true полностью отключает красивую печать; также можно установить число (по умолчанию 3) для управления условным многострочным поведением - см. документы.

  • По умолчанию вывод упаковывается в примерно 60 символов < sup> спасибо, Shrey, независимо от того, отправляется ли вывод в файл или на терминал. На практике, поскольку разрывы строк происходят только на границах свойств, вы часто получаете более короткие строки, но они также могут быть длиннее (например, с длинными значениями свойств).

  • В v6.3.0 + вы можете использовать параметр breakLength для отмены ограничения в 60 символов; если вы установите его на Infinity, все будет выводиться в виде одной строки.

Если вам нужен больший контроль над красивой печатью, рассмотрите возможность использования _ 40_ с третьим аргументом, но обратите внимание на следующее:

  • Сбой с объектами, имеющими циклические ссылки, например module в глобальном контексте.
  • Методы (функции) НЕ будут включены по замыслу.
  • Вы не можете выбрать отображение скрытых (неперечислимых) свойств.
  • Example call:
    • 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

    • if true, then the object's non-enumerable properties [those designated not to show up when you use for keys in obj or Object.keys(obj)] will be shown too. Defaults to false.
  • depth

    • tells inspect how many times to recurse while formatting the object. This is useful for inspecting large complicated objects. Defaults to 2. To make it recurse indefinitely, pass null.
  • colors

    • if true, then the output will be styled with ANSI color codes. Defaults to false. Colors are customizable [… – see link].
  • customInspect

    • if false, then custom inspect() functions defined on the objects being inspected won't be called. Defaults to true.

util.format() заполнители строки формата (1-й аргумент)

Некоторые поддерживаемые заполнители:

Текущий полный список см. в последних документах по Node.js.

  • %s - Строка.
  • %d - Число (как целое, так и с плавающей запятой).
  • %j - JSON.
  • %% - одинарный знак процента («%»). Это не требует аргументов.
person mklement0    schedule 17.12.2014
comment
Один из способов упростить это - сделать небольшую именованную функцию, которая выполняет console.dir(...) без всякого набора текста: show = (v, depth=null)=> console.dir(v,{depth:depth}), а затем вызывает ее так show(variable) или show(variable, depth=1). - person loco.loop; 02.05.2020
comment
Спасибо за полный ответ = ›ЛУЧШЕЕ РЕШЕНИЕ, КОТОРОЕ ВЫ ПРЕДОСТАВИЛИ: JSON.stringify ({one: 1, two: 'deux', three: true}, undefined, 2); - person Deunz; 17.03.2021

Другой простой способ - преобразовать его в json.

console.log('connection : %j', myObject);
person niksmac    schedule 15.01.2014
comment
Хороший трюк, но вывод не будет предварительно оформлен, что затрудняет чтение для больших объектов (суть вопроса). - person Dan Dascalescu; 02.08.2014
comment
по-прежнему очень полезен и быстрее копируется и вставляется на jsonlint.com, чем требуется utils :) - person SSH This; 24.02.2016
comment
Я думаю, что это здорово, когда у вас есть редактор, который будет форматировать json для вас, но вам просто нужно скопировать его из REPL. - person jcollum; 13.12.2017
comment
Это очень удобно и полезно, если объект небольшой. - person Chinmay Samant; 09.11.2018

Начиная с Node.js 6.4.0, эту проблему можно элегантно решить с помощью util.inspect.defaultOptions:

require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
person silverwind    schedule 26.01.2017

Попробуй это:

console.dir(myObject,{depth:null})
person hirra    schedule 19.10.2015

возможно console.dir - это все, что вам нужно.

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

Использует util.inspect для obj и выводит полученную строку на стандартный вывод.

используйте опцию util, если вам нужно больше контроля.

person Luke W    schedule 02.03.2014
comment
Начиная с (по крайней мере) v0.11.14, вы можете передавать объект параметров в качестве второго аргумента, который передается в util.inspect(). - person mklement0; 17.12.2014

Могут быть применены оба этих использования:

// 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));
person Erce    schedule 11.01.2018

Вы также можете сделать

console.log(JSON.stringify(myObject, null, 3));
person Eesa    schedule 14.02.2016

Хороший способ проверки объектов - использовать параметр узла --inspect с Chrome DevTools for Node.

node.exe --inspect www.js

Откройте chrome://inspect/#devices в Chrome и нажмите Открыть выделенный DevTools для узла.

Теперь каждый зарегистрированный объект доступен в инспекторе, как обычный JS, запущенный в chrome.

введите описание изображения здесь

Нет необходимости повторно открывать инспектор, он подключается к узлу автоматически, как только узел запускается или перезапускается. И --inspect, и Chrome DevTools for Node могут быть недоступны в старых версиях Node и Chrome.

person Ali    schedule 17.04.2017
comment
Сообщение для меня: попробуйте - ›node.exe --inspect index.js - person Lonely; 10.03.2019
comment
Это должно быть сверху. лучший ответ. :) - person princebillyGK; 12.04.2020

Думаю, это может быть вам полезно.

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 определяет вставку пробелов для красивой печати. Это может быть строка или число (количество пробелов).

person Nirav Sutariya    schedule 14.06.2019

Вы можете просто добавить 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, так и в оболочке узла.


Обновлять:

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))
person harish2704    schedule 30.09.2015

Простым трюком будет использование модуля debug для добавления DEBUG_DEPTH=null в качестве переменной среды при запуске скрипта.

Ex.

DEBUG = * DEBUG_DEPTH = нулевой узел index.js

В вашем коде

const debug = require('debug');
debug("%O", myObject);
person Chintan    schedule 27.07.2017
comment
@Bala Вам нужно будет установить модуль отладки в свой проект npm install debug --save - person Chintan; 18.11.2017

Самый простой вариант:

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

person Sunil Jamkatel    schedule 18.09.2019
comment
Это не решает проблему печати myObject на произвольную глубину - person Gershy; 07.10.2019

JSON.stringify ()

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

Отлично подходит для глубокого изучения объектов данных. Этот подход работает с вложенными массивами и вложенными объектами с массивами.

person Stephen Blum    schedule 19.02.2020

Узел REPL имеет встроенное решение для переопределения способа отображения объектов, см. здесь.

Модуль REPL внутренне использует util.inspect() при печати значений. Однако util.inspect делегирует вызов функции inspect() объекта, если она есть.

person Lloyd    schedule 11.02.2016

Если вы ищете способ показать скрытые элементы в вашем массиве, вам нужно передать maxArrayLength: Infinity

console.log(util.inspect(value, { maxArrayLength: Infinity }));
person Lukas    schedule 16.08.2020