Як я можу отримати повний об’єкт у console.log () Node.js (), а не "[Об'єкт]"?


892

Як налагоджувати за допомогою 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.

Відповіді:


1457

Вам потрібно використовувати 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()Документи .


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 })це робота для мене
Veck Hsiao

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


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
Прем Саніл

313

Збірка безлічі корисних відповідей з (принаймні) 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()так само, як REPL 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 }друкує з необмеженою глибиною ; Дивись нижче.
        • Ви не можете ввімкнути забарвлення синтаксису.
    • Якщо перший аргумент 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 + : Необов'язковий другий аргумент визначає параметри для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використовує багаторядковий вихід беззастережно , тоді як trueвзагалі вимикає гарне друкування; його також можна встановити на число (за замовчуванням 3) для управління умовною багаторядковою поведінкою - див . Документи .

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

  • У версії v6.3.0 + ви можете скористатись breakLengthопцією, щоб змінити обмеження на 60 символів; якщо встановити його Infinity, все виводиться в один рядок.

Якщо ви хочете більше контролювати гарне друкування, подумайте про використання 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-й аргумент):

Необов'язковий об'єкт параметрів може бути переданий, що змінює певні аспекти відформатованого рядка; деякі підтримувані властивості:

Дивіться останні документи Node.js для поточного повного списку.

  • showHidden

    • якщо true, тоді також будуть показані неперелічені властивості об'єкта [ті, які не відображаються під час використання for keys in objабо Object.keys(obj)]. За замовчуванням до false.
  • depth

    • повідомляє перевірити, скільки разів повторювати під час форматування об'єкта. Це корисно для огляду великих складних предметів. За замовчуванням до 2. Щоб повторно повторитись, перейдіть null.
  • colors

    • якщо вірно, то вихід буде стилізований з кольорами ANSI кольорів. За замовчуванням до false. Кольори налаштовуються [… - див. Посилання].
  • customInspect

    • якщо falseтоді спеціальні inspect()функції, визначені на об'єктах, що перевіряються, не будуть викликатися. За замовчуванням до true.

util.format()заповнювачі формату-рядка (1-й аргумент)

Деякі із підтримуваних заповнювачів:

Дивіться останні документи Node.js для поточного повного списку.

  • %s - Рядок.
  • %d - Число (і ціле, і плаваюче).
  • %j - JSON.
  • %%- знак одиничного відсотка ('%'). Це не вимагає аргументів.

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

12
Хороший трюк, але вихід не буде доопрацьований, через що важко читати великі об’єкти (суть питання).
Дан Даскалеску

2
все ще дуже корисно та швидше скопіювати та вставити на jsonlint.com, ніж вимагати utils:)
SSH Це

1
Я думаю, що це чудово, коли у вас є редактор, який буде форматувати json для вас, але вам просто потрібно скопіювати його з
REPL

2
Це дуже зручно і корисно, якщо об’єкт невеликий
Chinmay Samant



24

можливо, console.dirце все, що вам потрібно.

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

Використовує util.inspect на obj та друкує результуючу рядок для stdout.

скористайтеся опцією util, якщо вам потрібно більше контролю.



Станом на (принаймні) v0.11.14, ви можете передавати об'єкт параметрів як другий аргумент, який передається util.inspect().
mklement0

21

Ви також можете зробити

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

19

Хороший спосіб оглянути об’єкти - використовувати параметр node --inspect з Chrome DevTools for Node .

node.exe --inspect www.js

Відкрийте chrome://inspect/#devicesв хромі та натисніть Відкрити виділений DevTools for Node

Тепер кожен зареєстрований об'єкт доступний для інспектора, як звичайний JS, що працює в хромі.

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

Немає необхідності знову відкривати інспектор, він підключається до вузла автоматично, як тільки вузол запускається або перезапускається. І Innspect, і Chrome DevTools для 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));

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, ' ' ); }

то ваш об’єкт буде представлений як потрібно в консолі.log та оболонці вузла


3

Простим фокусом було б використання debugмодуля для додавання DEBUG_DEPTH=nullяк змінної середовища при запуску сценарію

Вих.

DEBUG = * DEBUG_DEPTH = null node index.js

У вашому коді

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

@Bala Вам потрібно буде встановити модуль "налагодження" у вашому проекті "npm install debug --save"
Chintan

2

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

Модуль REPL внутрішньо використовує util.inspect()під час друку значень. Однак util.inspectделегує виклик функції об’єкта inspect() , якщо він має його.



0

JSON.stringify ()

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

Відмінно підходить для глибокого огляду об’єктів даних. Цей підхід працює на вкладених масивах та вкладених об'єктах з масивами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.