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

897

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

Михал Перлаковский
источник

Ответы:

1462

Вам необходимо использовать 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()документы .

250R
источник
4
Хорошее решение. Хотя нет необходимости указывать {showHidden: false}, если по умолчанию установлено значение false.
ecdeveloper
36
Хорошо знать; не уверен, когда он был представлен, но по крайней мере узел v0.10.33 console.log() неявно применяется util.inspect()к своим аргументам, предполагая, что 1-й не является строкой формата. Если вы довольны util.inspect()параметрами по умолчанию, просто console.log(myObject)подойдет - не требуется util; console.dir()делает то же самое, но принимает только `объект для проверки; по крайней мере v0.11.14, вы можете передать объект параметров util.inspect()как второй аргумент; мой ответ имеет больше деталей.
mklement0
4
@ mklement0 У меня есть узел v5.3.0, и когда console.log(obj)он все еще печатает [Object] для глубоко вложенных объектов :( Мне бы очень хотелось, чтобы он вел себя так, как вы описываете.
SSH Это
47
@SSH: console.log()это неизбежно ограничивается 2 уровня (поскольку он использует по util.inspect()умолчанию «s , не позволяя изменять его); console.dir()имеет то же ограничение по умолчанию, но вы можете передать объект параметров в качестве второго аргумента, чтобы изменить его (который передается util.inspect(); обратите внимание, что , однако , console.dir() можно печатать только один объект за раз. Чтобы печатать с неограниченной глубиной, используйте console.dir(myObject, { depth: null }).
mklement0
13
console.dir(myObject, { depth: null })это работа для меня
Век Сяо
632

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

user1106925
источник
2
также +1 за разрывы строк и отступы - почти всегда желательно для меня лично
toblerpwn
59
Обратите внимание, что вы не можете JSON.stringify объекты с круговыми ссылками . Как это происходит с объектами DOM, например. Stringify выдаст «Ошибка: преобразование круговой структуры в JSON».
Игнасио Лаго
11
это не полный объект. объекты, содержащие только функции, будут {}. Конечно, это может быть положительным или отрицательным в зависимости от того, что вы хотите распечатать.
Лоуренс Веру
1
console.log(JSON.stringify(myObject, null, 4));довольно круто! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms
1
В моем случае я получаю эту ошибку TypeError: Преобразование круговой структуры в JSON
Prem Sanil
314

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

ТЛ; др

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

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

Почему нет util.inspect()? Потому что это уже в основе диагностической продукции: console.log()и console.dir(), а также Node.js РЕПЛ использовать 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 }печать с неограниченной глубиной ; см. ниже.
        • Вы не можете включить синтаксическую раскраску.
    • Если 1-й аргумент является строкой формата (см. Ниже): используется 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 использует многострочный вывод , а вообще отключает симпатичную печать; он также может быть установлен на число (по умолчанию ) для управления условным многострочным поведением - см. документацию .true3

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

  • В 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()объект параметров (2-й аргумент):

Может быть передан необязательный объект параметров, который изменяет определенные аспекты форматированной строки; некоторые из поддерживаемых свойств:

См. Последние документы 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()заполнители строки формата (1-й аргумент)

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

См. Последние документы Node.js для текущего, полного списка.

  • %s - Струна.
  • %d - Число (как целое число, так и число с плавающей запятой).
  • %j - JSON.
  • %%- один знак процента («%»). Это не потребляет аргумента.
mklement0
источник
1
Одним из способов упростить это было бы сделать небольшую именованную функцию, чтобы обойтись console.dir(...)без всей типизации: show = (v, depth=null)=> console.dir(v,{depth:depth})и затем вызывать ее так show(variable)или show(variable, depth=1).
loco.loop
56

Другой простой метод - конвертировать его в JSON.

console.log('connection : %j', myObject);
niksmac
источник
12
Хороший трюк, но результат не будет предварительно проверен, что затруднит чтение больших объектов (суть вопроса).
Дан Даскалеску
2
все еще очень полезно, и быстрее копировать и вставлять в jsonlint.com, чем требуется utils:)
SSH This
1
Я думаю, что это замечательно, когда у вас есть редактор, который будет форматировать json для вас, но вам просто нужно скопировать его из REPL
jcollum
2
Это очень удобно и полезно, если объект маленький
Чинмай Самант
43

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

console.dir(myObject,{depth:null})
hirra
источник
32

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

require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
Silverwind
источник
Как сделать его постоянным?
TheMaster
24

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

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

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

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

Люк В
источник
Начиная с версии (как минимум) v0.11.14, вы можете передать объект параметров в качестве второго аргумента, который передается в util.inspect().
mklement0
21

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

console.log(JSON.stringify(myObject, null, 3));
Иса
источник
19

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

node.exe --inspect www.js

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

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

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

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

Али
источник
1
Сообщение для меня: попробуйте это ->node.exe --inspect index.js
Одинокий
Это должно быть на вершине. лучший ответ. :)
princebillyGK
11

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

// 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));
Ercé
источник
10

Я думаю, что это может быть полезно для вас.

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

Нирав Сутария
источник
4

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

harish2704
источник
3

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

Ex.

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

В вашем коде

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

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

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

Lloyd
источник
2

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

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

Сунил Джамкатель
источник
Это не решает проблему печати myObjectна произвольную глубину
Гершом
0

JSON.stringify ()

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

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

Стивен Блум
источник