it-swarm.com.ru

Как я могу получить полный объект в console.log () Node.js, а не '[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.

710
user1372449

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

1186
250R

Вы можете использовать JSON.stringify и получить некоторые отступы Nice, а также, возможно, более легкий для запоминания синтаксис.

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

532
user1106925

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

; Т.Л. Dr

util.inspect() лежит в основе диагностического вывода: console.log() и console.dir(), а также Node.js REPL используют 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-й аргумент IS строка формата (см. Ниже): использует 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 + : необязательный 2-й аргумент определяет параметры для 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() автоматически (и неизменно) Pretty-печатает объект и массив представления , но выдает многострочный вывод только при необходимости - если все умещается на одной строке печатается только 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

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

  • 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.
  • % - одиночный знак процента ('%'). Это не потребляет аргумента.
234
mklement0

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

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

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

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

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

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

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

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

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

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

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

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

18
Luke W

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

node.exe --inspect www.js

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

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

enter image description here

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

13
Ali

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

// 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));
10
Erce

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

4
harish2704

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

Ex.

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

В вашем коде

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

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

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

2
Lloyd

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

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

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