Tam nesneyi '[Nesne]' yerine Node.js'nin console.log () biçiminde nasıl edinebilirim?


894

Kullanarak hata ayıklarken console.log(), tüm nesneyi nasıl alabilirim?

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

Çıktılar:

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

Ama aynı zamanda mülkün içeriğini de görmek istiyorum f.

Yanıtlar:


1460

Kullanmanız gerekenler 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 */))

çıktılar

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

util.inspect()Dokümanlara bakın .


4
Güzel çözüm. Varsayılan olarak false olarak ayarlandığı sürece {showHidden: false} öğesini belirtmenize gerek yoktur.
ecdeveloper

36
Bunu bildiğim iyi oldu; ne zaman tanıtıldığından emin değil, ancak en azından düğüm itibariyle argümanlarına v0.10.33 console.log() dolaylı olarak uygulandığı util.inspect()için, ilkinin bir format dizesi olmadığı varsayılarak. util.inspect()'İn varsayılan seçeneklerinden memnunsanız console.log(myObject), yapmanız gerekecek - gerek yok util; console.dir()aynı şeyi yapar, ancak sadece `inceleme nesnesini kabul eder; en azından 2. argüman olarak v0.11.14seçenekler nesnesini iletebilirsiniz util.inspect(); cevabımın daha fazla detayı var.
mklement0

4
@ mklement0 V5.3.0 düğümü var ve console.log(obj)hala derin yuvalanmış nesneler için [Nesne] yazdırdığımda :( Gerçekten tanımladığınız gibi davranmasını dilerdim.
SSH

47
@SSH: console.log()her zaman 2 seviye ile sınırlıdır (çünkü util.inspect()varsayılanı değiştirmenize izin vermeden kullanır ); console.dir()varsayılan olarak aynı sınıra sahiptir, ancak bu seçeneği değiştirmek için 2. bağımsız değişken olarak bir seçenek nesnesine iletebilirsiniz (bu, yalnızca bir kerede 1 nesne yazdırabileceğine util.inspect()dikkat edin) . .console.dir()console.dir(myObject, { depth: null })
mklement0

13
console.dir(myObject, { depth: null })benim için iş
Veck Hsiao

632

JSON.stringifySözdizimini hatırlamak ve belki de daha kolay hatırlamak gibi güzel bir girinti elde edebilir ve alabilirsiniz.

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

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

Üçüncü argüman girinti seviyesini ayarlar, böylece bunu istediğiniz gibi ayarlayabilirsiniz.

Gerekirse daha fazla ayrıntı burada:

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


2
Ayrıca satır sonları ve girinti için +1 - neredeyse her zaman şahsen benim için istenen
toblerpwn

59
Dairesel başvuruları olan nesneleri JSON.stringify yapamayacağınızı unutmayın . Örneğin DOM nesnelerinde olduğu gibi. Stringify bir "Hata: Dairesel yapı JSON'a dönüştürülüyor" atar.
Ignacio Lago

11
bu tam nesne değil. yalnızca işlevleri içeren nesneler {} olacaktır. Elbette bu, ne yazdırmak istediğinize bağlı olarak pozitif veya negatif olabilir.
Lawrence Weru

1
console.log(JSON.stringify(myObject, null, 4));oldukça havalı! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms

1
Benim durumumda bu hatayı alıyorum TypeError: Dairesel yapıyı
JSON'a

313

(En azından) Node.js'den v0.10.33(kararlı) / v0.11.14(kararsız) muhtemelen (en azından) v7.7.4(bu cevaba yönelik en son güncellemeden itibaren geçerli olan sürüm ) üzerinden birçok yararlı cevabın bir derlemesi . Onun yardımı için Rory O'Kane için şapka ucu .

tl; Dr.

Sorudaki örnek için istenen çıktıyı almak için şunu kullanın console.dir():

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

Neden olmasın util.inspect()? Zaten teşhis çıktısının merkezinde yer alıyor: console.log()ve console.dir()Node.js REPL de dolaylı olarak kullanıyorutil.inspect() . Genellikle doğrudan aramak ve aramak gerekli değildirrequire('util')util.inspect() .

Detaylar aşağıda.


  • console.log()(ve diğer adı, console.info()):

    • 1. bağımsız değişken bir biçim dizesi DEĞİLSE : util.inspect()her bağımsız değişkene otomatik olarak uygulanır:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
      • Eğer unutmayın seçenekleri geçemez aracılığıyla util.inspect()2 kayda değer sınırlamaları ima Bu durumda, içinde:
        • Yapısal Çıktının derinliği 2 seviye ile sınırlıdır (varsayılan).
          • Bunu ile değiştiremeyeceğiniz için console.log(), bunun yerineconsole.dir() : sınırsız derinlikte console.dir(myObject, { depth: null }baskılar ; aşağıya bakınız.
        • Sözdizimi renklendirmesini açamazsınız.
    • 1. bağımsız değişken bir biçim dizgiyse (aşağıya bakın): util.format()biçim dizesine dayalı olarak kalan bağımsız değişkenleri yazdırmak için kullanılır (aşağıya bakın); Örneğin:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
      • Not:
        • Nesneleri temsil etmek için bir yer tutucu yoktur util.inspect().
        • İle oluşturulan JSON %jgüzel yazdırılmaz.
  • console.dir():

    • İncelemek için sadece 1 argümanı kabul eder ve her zaman geçerlidir util.inspect()- esasen, util.inspect()varsayılan olarak seçenekler olmadan bir sarıcı ; Örneğin:
      • 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 + : İsteğe bağlı 2. bağımsız değişken için seçenekleriutil.inspect() belirtir - aşağıya bakın; Örneğin:
      • console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
  • REPL : örtülü olan bir ifadenin bir dönüş değeri yazdırır util.inspect() ile sözdizimi renklendirme ;
    yani, sadece bir değişkenin adını yazmak ve Enter tuşuna basmak değerinin denetlenen bir versiyonunu basacaktır; Örneğin:
    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect()nesne ve dizi temsillerini otomatik olarak güzel yazdırır , ancak yalnızca gerektiğinde çok satırlı çıktı üretir .

  • Güzel yazdırma davranışı compact, isteğe bağlı optionsbağımsız değişkende özellik tarafından denetlenebilir ; koşulsuz olarakfalse çok satırlı çıktı kullanırken , güzel yazdırmayı tamamen devre dışı bırakır; koşullu çok satırlı davranışı kontrol etmek için bir sayıya (varsayılan değer ) da ayarlanabilir - bkz.true3 dokümanlara .

  • Varsayılan olarak, çıktı bir dosyaya veya terminale gönderilip gönderilmediğine bakılmaksızın , Shrey sayesinde çıktı yaklaşık 60 karakterle sarılır . Uygulamada, satır sonları yalnızca mülk sınırlarında gerçekleştiği için , genellikle daha kısa satırlarla sonuçlanırsınız, ancak bunlar daha uzun da olabilir (örneğin, uzun özellik değerleriyle).

  • V6.3.0 + ' breakLengthda 60 karakter sınırını geçersiz kılma seçeneğini kullanabilirsiniz ; olarak ayarlarsanız Infinity, her şey tek bir satırda çıkar.

Güzel baskı üzerinde daha fazla kontrol istiyorsanız, JSON.stringify()3. bir argümanla kullanmayı düşünün , ancak aşağıdakilere dikkat edin:

  • Genel bağlamda olduğu gibi döngüsel başvuruları olan nesnelerde başarısız olur module.
  • Yöntemlere (fonksiyonlara) tasarım dahil DEĞİLDİR.
  • Gizli (numaralandırılamayan) özellikleri göstermeyi seçemezsiniz.
  • Örnek çağrı:
    • JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces

util.inspect()seçenekler nesnesi (2. bağımsız değişken):

Biçimlendirilmiş dizenin belirli yönlerini değiştiren isteğe bağlı bir seçenekler nesnesi geçirilebilir; Bazı desteklenen özelliklerin şunlardır:

Mevcut tam liste için en yeni Node.js belgelerine bakın .

  • showHidden

    • eğer true, o zaman nesnenin olmayan enumerable özellikleri [kullandığınızda göstermek için değil belirtilenler for keys in objveya Object.keys(obj)] çok gösterilecektir. Varsayılan olarak false.
  • depth

    • nesneyi biçimlendirirken kaç kez tekrarlanacağını denetler. Bu, büyük karmaşık nesneleri incelemek için yararlıdır. Varsayılan değer 2'dir null. Süresiz olarak tekrarlama yapmak için geçin .
  • colors

    • true olursa, çıktı ANSI renk kodlarıyla biçimlendirilir. Varsayılan olarak false. Renkler özelleştirilebilir [… - bağlantıya bakın].
  • customInspect

    • eğer false, inspect()incelenen nesneler üzerinde tanımlanan özel fonksiyonlar çağrılmaz. Varsayılan olarak true.

util.format()biçim dizesi yer tutucuları (1. bağımsız değişken)

Biraz desteklenen tutucuların şunlardır:

Mevcut tam liste için en yeni Node.js belgelerine bakın .

  • %s - Dize.
  • %d - Sayı (hem tamsayı hem de kayan sayı).
  • %j - JSON.
  • %%- yüzde işareti ('%'). Bu bir argüman tüketmez.

1
Bunu basitleştirmenin bir yolu, console.dir(...)tüm yazmadan yapmak için küçük bir adlandırılmış işlev yapmaktır : show = (v, depth=null)=> console.dir(v,{depth:depth})ve sonra böyle çağırın show(variable)veya show(variable, depth=1).
loco.loop

56

Başka bir basit yöntem json'a dönüştürmektir

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

12
Güzel bir hile ama çıktı önceden işlenmeyecek, bu da büyük nesneler (sorunun noktası) için okumayı zorlaştırıyor.
Dan Dascalescu

2
yine de çok yararlı ve kopyalamak ve jsonlint.com yapıştırmak daha hızlı gerek utils:)
SSH Bu

1
Sanırım
json'u

2
Nesne küçükse bu çok kullanışlı ve yararlı
Chinmay Samant

43

Bunu dene:

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



21

Ayrıca yapabilirsin

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

19

Nesneleri incelemenin iyi bir yolu , Chrome DevTools for Node ile node --inspect seçeneğini kullanmaktır .

node.exe --inspect www.js

Açık chrome://inspect/#deviceskrom ve tıklama Düğüm için açık adanmış DevTools

Artık kaydedilen her nesne, Chrome'da çalışan normal JS gibi denetçide kullanılabilir.

resim açıklamasını buraya girin

Müfettişi yeniden açmaya gerek yoktur, düğüm başlar başlamaz veya yeniden başlar başlamaz düğüme otomatik olarak bağlanır. Hem --inspect hem de Chrome DevTools for Node , Node ve Chrome'un eski sürümlerinde bulunmayabilir.


1
Benim için bir mesaj: denemek o -node.exe --inspect index.js
Yalnız

Bu üstte olmalı. en iyi cevap. :)
princebillyGK

11

Bu kullanımların her ikisi de uygulanabilir:

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

Bunun sizin için yararlı olabileceğini düşünüyorum.

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

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

Bu cevapta belirtildiği gibi :

JSON.stringify'nin üçüncü parametresi güzel baskı için beyaz boşluk yerleştirmeyi tanımlar. Bir dize veya bir sayı olabilir (boşluk sayısı).


4

inspect()Nesneye, console.logiletilerdeki nesnenin temsilini geçersiz kılacak bir yöntem ekleyebilirsiniz.

Örneğin:

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

ardından nesneniz hem console.log hem de düğüm kabuğunda gerektiği gibi temsil edilir


3

Basit bir hile , betiği çalıştırırken ortam değişkeni olarak debugeklemek için modül kullanmak olacaktır.DEBUG_DEPTH=null

Ör.

DEBUG = * DEBUG_DEPTH = boş düğüm index.js

Kodunuzda

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

@Bala "npm install debug --save" adlı projenize "debug" modülünü kurmanız gerekecek
Chintan

2

REPL düğümü, nesnelerin nasıl görüntülendiğini geçersiz kılmak için yerleşik bir çözüme sahiptir, buraya bakın .

REPL modülü util.inspect(), değerleri yazdırırken dahili olarak kullanır . Ancak, util.inspectçağrıyı inspect() , varsa nesnenin işlevine devreder .



0

JSON.stringify ()

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

Veri nesnelerinin derinlemesine incelenmesi için idealdir. Bu yaklaşım, iç içe diziler ve dizili iç içe nesneler üzerinde çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.