「[オブジェクト]」ではなく、Node.jsのconsole.log()で完全なオブジェクトを取得するにはどうすればよいですか?


894

を使用してデバッグする場合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

回答:


1460

使用する必要があります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を参照してください。


4
素晴らしい解決策。デフォルトがfalseである限り、{showHidden:false}を指定する必要はありません。
ecdeveloper 2014

36
知っておきたい いつ導入されたのかはわかりませんが、少なくともnode では、最初の引数がフォーマット文字列ではないと想定して、その引数にv0.10.33 console.log() 暗黙的に適用さutil.inspect()れます。あなたとしている満足している場合util.inspect()のデフォルトのオプションは、単にconsole.log(myObject)行いません-必要とする必要がutilconsole.dir()同じことを行いますが、 `オブジェクトだけを検査対象として受け入れます。少なくともv0.11.14、オプションオブジェクトをutil.inspect()2番目の引数として渡すことができます。私の答えはより詳細です。
mklement0 2014

4
Iとき@ mklement0私はノードV5.3.0を持っており、console.log(obj)それはまだ深くネストされたオブジェクトのための[オブジェクト]を印刷します:(私は本当にあなたが説明するように、それは振る舞うことを望む。
SSHこの

47
@SSHは:console.log()されて常にに限る2つのレベル(それが使用しているのでutil.inspect()、あなたがそれを変更させることなくのデフォルト)。console.dir()デフォルトでは同じ制限がありますが、オプションオブジェクトを2番目の引数として渡して変更できます(これはに渡されutil.inspect()ます。ただし、一度に1つのオブジェクト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"
                }
            }
        }
    }
}

3番目の引数はインデントレベルを設定するので、必要に応じて調整できます。

必要に応じて、ここに詳細を示します。

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


2
また、改行やインデントのための1 -ほとんど常に個人的に私のために希望
toblerpwn

59
循環参照を持つJSON.stringifyオブジェクトは使用できないことに注意してください。たとえば、DOMオブジェクトで発生するように。Stringifyは「エラー:循環構造をJSONに変換しています」をスローします。
イグナシオラゴ

11
これは完全なオブジェクトではありません。関数のみを含むオブジェクトは{}になります。もちろん、何を印刷したいかによって、ポジティブになることもネガティブになることもあります。
Lawrence Weru

1
console.log(JSON.stringify(myObject, null, 4));かなりクール!https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms 2017年

1
私の場合、このエラーTypeError:循環構造をJSONに変換する
Prem Sanil

313

(少なくとも)Node.js v0.10.33(stable)/ v0.11.14(unstable)から(少なくとも)v7.7.4(この回答の最新アップデート時点での最新バージョン)までの多くの有用な回答のコンパイル。彼の助けのためのロリー・オケインへの帽子の先端。

tl; dr

質問の例に必要な出力を取得するには、次を使用しますconsole.dir()

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

なんでutil.inspect()?すでに診断出力の中心にあるため:console.log()console.dir()同様のNode.js REPL を使用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 }とプリント無制限の深さを。下記参照。
        • 構文の色付けをオンにすることはできません。
    • 最初の引数がフォーマット文字列の場合(以下を参照):を使用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()

    • inspectに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(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect()オブジェクト配列表現を自動的にプリティプリントします、必要な場合にのみ複数行の出力を生成します

  • pretty-printingの動作はcompact、オプションのoptions引数のプロパティによって制御できます。false複数行の出力を使用して無条件のに対し、true無効は全くかなり印字。また、数値に設定して(デフォルトは3)、条件付き複数行の動作を制御することもできます。ドキュメントを参照してください。

  • デフォルトでは、出力が ファイルに送られるか端末に送られるかに関係なくShreyのおかげ出力は約60文字折り返さます。実際には、改行はプロパティの境界でのみ発生するためでが短くなることがよくありますが、長くなる場合もあります(プロパティの値が長い場合など)。

  • v6.3.0 +では、breakLengthオプションを使用して60文字の制限を上書きできます。に設定するとInfinity、すべてが1つの出力に出力されます行でます。

プリティプリントをより詳細に制御したい場合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

    • オブジェクトのフォーマット中に何回再帰するかをinspectに指示します。これは、大きくて複雑なオブジェクトの検査に役立ちます。デフォルトは2 nullです。無限に再帰させるには、を渡します。
  • colors

    • trueの場合、出力はANSIカラーコードでスタイル設定されます。デフォルトはfalseです。色はカスタマイズ可能です[…–リンクを参照]。
  • customInspect

    • の場合falseinspect()検査対象のオブジェクトに定義されているカスタム関数は呼び出されません。デフォルトはtrueです。

util.format()format-stringプレースホルダー(第1引数)

いくつかサポートされているプレースホルダーのは次のとおりです。

最新の完全なリストについては、最新のNode.jsドキュメントをご覧ください。

  • %s - ストリング。
  • %d –数値(整数と浮動小数点の両方)。
  • %j – JSON。
  • %%–単一のパーセント記号( '%')。これは引数を消費しません。

1
これを簡略化する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
素敵なトリックですが、出力はきれいになりません。そのため、大きなオブジェクト(質問のポイント)を読み取ることが難しくなります。
Dan Dascalescu 2014

2
それでも非常に便利で、必要な場合よりもjsonlint.comにコピーして貼り付ける方が速いutils:)
SSH This

1
jsonをフォーマットするエディターがある場合、これは素晴らしいと思いますが、REPLからコピーするだけです
jcollum

2
これは、オブジェクトが小さい場合に非常に便利で便利です
Chinmay Samant



24

多分console.dirあなたが必要とするすべてです。

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

objでutil.inspectを使用し、結果の文字列をstdoutに出力します。

さらに制御が必要な場合は、utilオプションを使用します。



(少なくとも)v0.11.14以降、オプションオブジェクトを2番目の引数として渡すことができますutil.inspect()。これはに渡されます。
mklement0 2014

21

あなたもすることができます

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

19

オブジェクトを検査する良い方法は、ノードのChrome DevToolsで node --inspectオプションを使用することです。

node.exe --inspect www.js

オープンchrome://inspect/#devicesクロームとクリックノードのためのオープン専用のデベロッパーツール

これで、ログに記録されたすべてのオブジェクトが、Chromeで実行されている通常のJSのようにインスペクターで利用可能になります。

ここに画像の説明を入力してください

インスペクタを再度開く必要はありません。ノードが起動または再起動するとすぐにノードに自動的に接続します。ノード用の--inspectChrome DevToolsの両方は、NodeとChromeの古いバージョンでは使用できない場合があります。


1
私へのメッセージ:試してみてください->node.exe --inspect index.js
Lonely

これが一番上になるはずです。ベストアンサー。:)
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の3番目のパラメーターは、プリティプリント用の空白挿入を定義します。文字列または数値(スペースの数)を指定できます。


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

次に、オブジェクトはconsole.logとノードシェルの両方で必要に応じて表示されます


3

単純なトリックは、スクリプトを実行するときにdebugモジュールを使用しDEBUG_DEPTH=nullて環境変数として追加することです

DEBUG = * DEBUG_DEPTH = nullノード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 ))

データオブジェクトの詳細な検査に最適です。このアプローチは、ネストされた配列と、配列を持つネストされたオブジェクトで機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.