Как я могу получить полный объект в 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.

Ответ 1

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

Ответ 2

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

Ответ 3

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

ТЛ; др

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

Чтобы получить желаемый результат для примера в вопросе:

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

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


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

    • Если 1-й аргумент НЕ является строкой формата: 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() -style.
        • 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(){} }//echoes the object definition with syntax coloring.

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

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

  • В версии 6.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-й аргумент):

источник: http://nodejs.org/api/util.html#util_util_format_format

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

  • showHidden
    • если это true, то будут показаны также не перечисляемые свойства объекта [те, которые не отображаются при использовании for keys in obj или Object.keys(obj) ]. По умолчанию false.
  • depth
    • говорит инспектировать, сколько раз повторять при форматировании объекта. Это полезно для проверки больших сложных объектов. По умолчанию 2. Чтобы сделать его бесконечным, передайте null.
  • colors
    • если true, то вывод будет оформлен с помощью цветовых кодов ANSI. По умолчанию false. Цвета настраиваются [... - см. Ссылку].
  • customInspect
    • если false, то пользовательские функции inspect() определенные для проверяемых объектов, вызываться не будут. По умолчанию true.

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

источник: http://nodejs.org/api/util.html#util_util_format_format

  • %s - Строка.
  • %d - Число (как целое число, так и число с плавающей запятой).
  • %j - JSON.
  • % - одиночный знак процента ('%'). Это не потребляет аргумента.

Ответ 4

Еще один простой способ - преобразовать его в json

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

Ответ 5

Попробуйте следующее:

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

Ответ 6

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

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

Ответ 7

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

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

Использует util.inspect для obj и выводит итоговую строку в stdout.

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

Ответ 8

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

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

Ответ 9

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

node.exe --inspect www.js

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

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

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

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

Ответ 10

Оба эти применения могут быть применены

// more compact and colour can be applied (better for process managers logging)

console.dir(queryArgs, { depth: null, colors: true });

// clear list of actual values

console.log(JSON.stringify(queryArgs, undefined, 2));

Ответ 11

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

Ответ 12

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

const myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};

console.log(JSON.stringify(myObject, null, '\t'));

Ответ 13

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

Исх.

DEBUG = * DEBUG_DEPTH = null node index.js

В коде

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

Ответ 14

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

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

Ответ 15

Это может распечатать ключ объекта и значение объекта самым простым способом. Просто попробуйте.

const jsonObj = {
  a: 'somestring',
  b: 42,
  c: false
};

Array.from(Object.keys(jsonObj)).forEach(function(key){
  console.log(key + ":" + jsonObj[key]);
});

Ответ 16

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

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

Ответ 17

Попробуйте эту вспомогательную функцию

const l = (...params) => console.log(...params.map(param => JSON.stringify(param, null, 4)))

Использование:

l(obj1,obj2...)

Вы также можете использовать его в других средах javascript, таких как PhantomJs, например