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

14 ответов


вам нужно использовать 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/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify


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

tl; dr

util.inspect() находится в основе диагностического вывода:console.log() и console.dir() а также узел.в 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-й аргумент является строкой формата (см. ниже): использует 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.
    • узел.с 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-prints объект и массив представления, но производит многострочный выход только при необходимости - если все помещается на одной строке, печатается только 1 строка.

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

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

если вы хотите больше контроля над pretty-printing, рассмотрите возможность использования JSON.stringify() С 3-й аргумент, но обратите внимание на следующее:

  • не с объектами, которые имеют циклические ссылки, например 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. Чтобы сделать его рекурсивным бесконечно, pass null.
  • colors
    • если true, то вывод будет выполнен с цветовыми кодами ANSI. По умолчанию:false. Цвета настраиваются [... - см. ссылку].
  • customInspect
    • если false, затем custom inspect() функции, определенные на проверяемых объектах, не будут вызываться. По умолчанию:true.

заполнители (1-й аргумент)

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

  • %s - строка.
  • %d - число (как целое число, так и float).
  • %j - JSON.
  • % - один знак процента ('%'). Это не требует аргумента.

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

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

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

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

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

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

использует util.проверьте на obj и печатает результирующую строку в stdout.

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


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

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

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

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

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

node.exe --inspect www.js

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

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

enter image description here

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


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

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

вы можете просто добавить 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, ' ' ); }

затем ваш объект будет представлен в соответствии с требованиями в обеих консолях.log и node shell


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

Ex.

DEBUG= * DEBUG_DEPTH=индекс нулевого узла.js

в код

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

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

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


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

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

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

l(obj1,obj2...)

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