Jak mogę uzyskać pełny obiekt w pliku console.log () Node.js zamiast „[Object]”?


892

console.log()Jak mogę uzyskać pełny obiekt podczas debugowania za pomocą ?

const myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};    
console.log(myObject);

Wyjścia:

{ a: 'a', b: { c: 'c', d: { e: 'e', f: [Object] } } }

Ale chcę też zobaczyć zawartość nieruchomości f.

Odpowiedzi:


1457

Musisz użyć 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 */))

Wyjścia

{ a: 'a',  b: { c: 'c', d: { e: 'e', f: { g: 'g', h: { i: 'i' } } } } }

Zobacz util.inspect()dokumenty .


4
Niezłe rozwiązanie. Chociaż nie trzeba podawać wartości {showHidden: false}, o ile domyślna wartość to false.
— ecdeveloper

36
Dobrze wiedzieć; nie jestem pewien, kiedy został wprowadzony, ale przynajmniej węzeł v0.10.33 console.log() domyślnie stosuje się util.inspect()do jego argumentów, zakładając, że pierwszy nie jest łańcuchem formatującym. Jeśli jesteś zadowolony z util.inspect()domyślnych opcji, po prostu console.log(myObject)zrobisz - nie musisz tego wymagać util; console.dir()robi to samo, ale akceptuje tylko `obiekt do sprawdzenia; przynajmniej v0.11.14możesz przekazać obiekt opcji util.inspect()jako drugi argument; moja odpowiedź zawiera więcej szczegółów.
— mklement0

4
@ mklement0 Mam węzeł v5.3.0 i kiedy console.log(obj)nadal drukuje [Obiekt] dla głęboko zagnieżdżonych obiektów :( Naprawdę chciałbym, żeby zachowywał się tak, jak opisano.
— SSH

47
@SSH: console.log()jest niezmiennie ograniczony do 2 poziomów (ponieważ używa util.inspect()domyślnych bez możliwości zmiany); console.dir()ma domyślnie ten sam limit, ale możesz przekazać obiekt opcji jako drugi argument, aby to zmienić (który jest przekazywany do util.inspect(); zwróć uwagę, że console.dir() można jednak wydrukować tylko 1 obiekt na raz. Aby wydrukować z nieograniczoną głębokością, użyj console.dir(myObject, { depth: null }),
— mklement0

13
console.dir(myObject, { depth: null })jest dla mnie praca
— Veck Hsiao

632

Możesz użyć JSON.stringifyi uzyskać ładne wcięcie, a także być może łatwiejszą do zapamiętania składnię.

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

{
    "a": "a",
    "b": {
        "c": "c",
        "d": {
            "e": "e",
            "f": {
                "g": "g",
                "h": {
                    "i": "i"
                }
            }
        }
    }
}

Trzeci argument ustawia poziom wcięcia, dzięki czemu można go dostosować zgodnie z potrzebami.

Więcej informacji tutaj w razie potrzeby:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify


2
także +1 za łamanie linii i wcięcia - prawie zawsze osobiście dla mnie pożądane
— toblerpwn

59
Zauważ, że nie możesz JSON.stringify obiektów z referencjami cyklicznymi . Tak jak na przykład w przypadku obiektów DOM. Stringify wyrzuci „Błąd: Konwertowanie okrągłej struktury do JSON”.
— Ignacio Lago,

11
to nie jest pełny obiekt. obiektami zawierającymi tylko funkcje będą {}. Oczywiście może to być dodatni lub ujemny w zależności od tego, co chcesz wydrukować.
— Lawrence Weru,

1
console.log(JSON.stringify(myObject, null, 4));całkiem fajne! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
— xgqfrms

1
W moim przypadku
— pojawia

313

Kompilacja wielu użytecznych odpowiedzi z (przynajmniej) Node.js v0.10.33(stabilny) / v0.11.14(niestabilny) prawdopodobnie poprzez (przynajmniej) v7.7.4(aktualną wersję z ostatniej aktualizacji tej odpowiedzi). Czubek kapelusza dla Rory O'Kane za pomoc.

tl; dr

Aby uzyskać pożądany wynik dla przykładu w pytaniu, użyj console.dir():

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

Dlaczego nie util.inspect()? Bo to już na samym wyjściu diagnostycznym console.log()i console.dir()jak również node.js REPL używać util.inspect() niejawnie . Zasadniczo nie jest koniecznerequire('util')util.inspect() bezpośrednie połączenie .

Szczegóły poniżej.


  • console.log()(i jego alias console.info()):

    • Jeśli pierwszy argument NIE jest ciągiem formatu : util.inspect()jest automatycznie stosowany do każdego argumentu:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
      • Należy pamiętać, że nie można przejść opcje poprzez util.inspect()w tym przypadku, co oznacza 2 znaczące ograniczenia:
        • Strukturalna głębokość wyjścia jest ograniczona do 2 poziomów (domyślnie).
          • Ponieważ nie możesz tego zmienić za pomocą console.log(), musisz zamiast tego użyć console.dir(): console.dir(myObject, { depth: null }wydruków z nieograniczoną głębią ; patrz poniżej.
        • Nie można włączyć kolorowania składni.
    • Jeśli pierwszy argument JEST łańcuchem formatu (patrz poniżej): używa util.format()do wydrukowania pozostałych argumentów na podstawie ciągu formatu (patrz poniżej); na przykład:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
      • Uwaga:
        • Nie ma symbolu zastępczego reprezentującego styl obiektów util.inspect() .
        • JSON wygenerowany przy pomocy %jNIE jest ładnie wydrukowany.
  • console.dir():

    • Akceptuje tylko 1 argument do sprawdzenia i zawsze ma zastosowanie util.inspect()- zasadniczo opakowanie util.inspect()bez opcji domyślnie; na przykład:
      • 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 + : Opcjonalny drugi argument określa opcje dlautil.inspect() - patrz poniżej; na przykład:
      • console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
  • REPL : domyślnie drukuje wartość zwrotną dowolnego wyrażenia za util.inspect() pomocą kolorowania składni ;
    tzn. wystarczy wpisać nazwę zmiennej i nacisnąć Enter, aby wydrukować sprawdzoną wersję jej wartości; na przykład:
    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect()automatycznie ładnie drukuje reprezentacje obiektów i tablic , ale generuje wielowierszowe dane wyjściowe tylko w razie potrzeby .

  • Zachowanie ładnego drukowania może być kontrolowane przez compactwłaściwość w opcjonalnym optionsargumencie; bezwarunkowofalse używa wyjścia wieloliniowego , a całkowicie wyłącza ładne drukowanie; można go również ustawić na liczbę (domyślnie jest to ), aby kontrolować warunkowe zachowanie wielu linii - patrz dokumentacja .true3

  • Domyślnie, wynik jest zawijany na około 60 znaków dzięki, Shrey , niezależnie od tego, czy dane wyjściowe są wysyłane do pliku czy terminala. W praktyce, ponieważ podziały linii występują tylko na granicach właściwości , często kończy się to krótszymi liniami, ale mogą być one również dłuższe (np. Z długimi wartościami właściwości).

  • W wersji 6.3.0 + możesz użyć breakLengthopcji, aby zastąpić limit 60 znaków; jeśli ustawisz na Infinity, wszystko jest wyprowadzane w jednym wierszu.

Jeśli chcesz mieć większą kontrolę nad ładnym drukowaniem, rozważ użycie JSON.stringify()trzeciego argumentu , ale zwróć uwagę na następujące kwestie :

  • Nie działa z obiektami, które mają odwołania cykliczne , na przykład modulew kontekście globalnym.
  • Metody (funkcje) z założenia NIE zostaną uwzględnione.
  • Nie możesz włączyć wyświetlania ukrytych (niepoliczalnych) właściwości.
  • Przykładowe wywołanie:
    • JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces

util.inspect()obiekt opcji (drugi argument):

Można przekazać opcjonalny obiekt opcji, który zmienia niektóre aspekty sformatowanego ciągu; niektóre obsługiwane właściwości to:

Zobacz najnowsze dokumenty Node.js, aby uzyskać aktualną, pełną listę.

  • showHidden

    • jeśli true, to zostaną również wyświetlone niepoliczalne właściwości obiektu [te, które mają nie pojawiać się podczas używania for keys in objlub Object.keys(obj)]. Domyślnie to false.
  • depth

    • informuje, ile razy ma się powtarzać podczas formatowania obiektu. Jest to przydatne do kontroli dużych skomplikowanych obiektów. Domyślnie jest to 2. Aby powtarzać się w nieskończoność, podaj null.
  • colors

    • jeśli true, wówczas wyjście będzie stylizowane za pomocą kodów kolorów ANSI. Domyślnie to false. Kolory można dostosowywać [… - patrz link].
  • customInspect

    • jeśli false, to inspect()funkcje niestandardowe zdefiniowane na kontrolowanych obiektach nie będą wywoływane. Domyślnie to true.

util.format()symbole zastępcze ciągu formatu (pierwszy argument)

Niektóre z obsługiwanych symboli zastępczych to:

Zobacz najnowsze dokumenty Node.js, aby uzyskać aktualną, pełną listę.

  • %s - Strunowy.
  • %d - Liczba (zarówno liczba całkowita, jak i liczba zmiennoprzecinkowa).
  • %j - JSON.
  • %%- pojedynczy znak procentu („%”). To nie zużywa argumentu.

1
Jednym ze sposobów, aby to uprościć, byłoby wykonanie niewielkiej funkcji o nazwie console.dir(...)bez wykonywania całego pisania: show = (v, depth=null)=> console.dir(v,{depth:depth})a następnie wywołanie jej w ten sposób show(variable)lub show(variable, depth=1).
— loco.loop

56

Inną prostą metodą jest konwersja do formatu json

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

12
Dobra sztuczka, ale wynik nie zostanie upiększony, co utrudnia odczytanie dużych obiektów (sedno pytania).
— Dan Dascalescu

2
nadal bardzo przydatne i szybsze kopiowanie i wklejanie na jsonlint.com niż wymaganie utils:)
— SSH To

1
Myślę, że ten jest świetny, gdy masz edytor, który sformatuje dla ciebie json, ale musisz go tylko skopiować z REPL
— jcollum

2
Jest to bardzo przydatne i pomocne, jeśli obiekt jest mały
— Chinmay Samant,



24

może console.dirto wszystko czego potrzebujesz.

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

Używa util.inspect na obj i wypisuje powstały ciąg na standardowe wyjście.

użyj opcji util, jeśli potrzebujesz większej kontroli.



Począwszy od (co najmniej) v0.11.14, możesz przekazać obiekt opcji jako drugi argument, który jest przekazywany do util.inspect().
— mklement0

21

Możesz też zrobić

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

19

Dobrym sposobem na sprawdzenie obiektów jest użycie opcji node --inspect w Chrome DevTools for Node .

node.exe --inspect www.js

Otwórz chrome://inspect/#devicesw chrome i kliknij Otwórz dedykowane narzędzia DevTools dla węzła

Teraz każdy zalogowany obiekt jest dostępny w inspektorze, podobnie jak zwykły JS działający w chrome.

wprowadź opis zdjęcia tutaj

Nie ma potrzeby ponownego otwierania inspektora, łączy się on z węzłem automatycznie, gdy tylko węzeł się uruchomi lub uruchomi ponownie. Zarówno --inspect, jak i Chrome DevTools dla Node mogą nie być dostępne w starszych wersjach Node i Chrome.


1
Wiadomość dla mnie: wypróbuj to ->node.exe --inspect index.js
— Lonely

To powinno być na górze. najlepsza odpowiedź. :)
— princebillyGK

11

Oba te zastosowania można zastosować:

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

Myślę, że może ci się to przydać.

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

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

Jak wspomniano w tej odpowiedzi :

JSON.stringifyTrzeci parametr określa wstawianie białych znaków do ładnego drukowania. Może to być ciąg znaków lub liczba (liczba spacji).


4

Możesz po prostu dodać inspect()metodę do swojego obiektu, która zastąpi reprezentację obiektu w console.logwiadomościach

na przykład:

var myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};
myObject.inspect = function(){ return JSON.stringify( this, null, ' ' ); }

wtedy twój obiekt będzie reprezentowany zgodnie z wymaganiami zarówno w pliku console.log, jak i powłoce węzła


3

Prostą sztuczką byłoby użycie debugmodułu, aby dodać DEBUG_DEPTH=nulljako zmienną środowiskową podczas uruchamiania skryptu

Dawny.

DEBUG = * DEBUG_DEPTH = null node index.js

W twoim kodzie

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

@Bala Musisz zainstalować moduł „debuguj” w swoim projekcie „npm install debug --save”
— Chintan

2

Węzeł REPL ma wbudowane rozwiązanie do przesłonięcia sposobu wyświetlania obiektów, patrz tutaj .

Moduł REPL używa wewnętrznie util.inspect()podczas drukowania wartości. Jednak util.inspectdeleguje wywołanie do funkcji obiektu inspect() , jeśli ją posiada.



0

JSON.stringify ()

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

Idealne do głębokiej inspekcji obiektów danych. To podejście działa na zagnieżdżonych tablicach i zagnieżdżonych obiektach z tablicami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.