'[Object]'가 아닌 Node.js의 console.log ()에서 전체 객체를 얻으려면 어떻게해야합니까?


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.

답변:


1458

당신이 사용해야합니다 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

36
알아 둘만 한; 언제 도입되었는지는 확실하지 않지만 적어도 첫 번째 노드 는 형식 문자열이 아니라고 가정하여 인수에 v0.10.33 console.log() 암시 적으로 적용됩니다 util.inspect(). util.inspect()의 기본 옵션에 만족한다면 간단히 console.log(myObject)할 필요가 없습니다 util. console.dir()동일하지만 검사 할 객체 만 받아들입니다. 적어도 v0.11.14options 객체를 util.inspect()두 번째 인수로 전달할 수 있습니다 . 내 답변에 자세한 내용이 있습니다.
mklement0

4
@ mklement0 나는 노드 v5.3.0을 가지고 있고 때 console.log(obj)깊이 중첩 된 객체에 대한 그것은 여전히 인쇄 [개체] :( 내가 정말 원하는 당신이 설명으로는 행동 것입니다.
SSH이

47
@SSH는 : console.log()됩니다 변함 에 제한 (그것을 사용하기 때문에 레벨 util.inspect()이 변경 허용하지 않고의 기본을); console.dir()기본적으로 같은 한계를 가지고 있지만, 당신은 옵션에서 전달할 수는에 통과되는 (즉를 변경하려면 두번째 인자로 객체 util.inspect(); 참고 console.dir() 오직 인쇄 할 수 있습니다 (1 개) . 그러나, 한 번에 객체를 무제한 깊이 사용하여 인쇄하려면 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 – 거의 항상 개인적으로
원함

59
순환 참조가있는 JSON.stringify 객체는 사용할 수 없습니다 . 예를 들어 DOM 객체에서 발생하는 것처럼. Stringify는 "오류 : 순환 구조를 JSON으로 변환"을 던집니다.
Ignacio Lago

11
이것은 전체 객체가 아닙니다. 함수 만 포함 된 객체는 {}입니다. 물론 인쇄하려는 내용에 따라 긍정적이거나 부정적 일 수 있습니다.
Lawrence Weru

1
console.log(JSON.stringify(myObject, null, 4));정말 멋진! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms 2012 년

1
내 경우에는이 오류가 발생합니다 TypeError : 원형 구조를 JSON으로 변환
Prem Sanil

313

(적어도) Node.js v0.10.33(안정적) / v0.11.14(안정적이지 않음) v7.7.4( 적어도) (이 답변에 대한 최신 업데이트 시점의 현재 버전 )에서 많은 유용한 답변을 편집 했습니다 . 그의 도움 을 위해 Rory O'Kane 의 모자 팁 .

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():

    • 검사 할 인수는 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()객체배열 표현을 자동으로 인쇄 하지만 필요할 때만 여러 줄로 출력합니다 .

  • pretty-printing 동작은 compact선택적 options인수 의 속성 으로 제어 할 수 있습니다 . 복 수행false 출력을 무조건 으로 사용하지만, true예쁜 인쇄를 무효로합니다. 조건부 다중 행 동작을 제어 하기 위해 숫자 (기본값 3)로 설정할 수도 있습니다 ( 문서 참조) .

  • 기본적으로 출력은 파일 또는 터미널로 전송되는지 여부에 관계없이 Shrey 덕분 에 약 60 자로 줄 바꿈 됩니다 . 실제로 줄 바꿈은 속성 경계에서만 발생하기 때문에 줄이 더 짧아 지지만 줄이 더 길 수도 있습니다 (예 : 속성 값이 길 경우).

  • v6.3.0 +에서는이 breakLength옵션을 사용 하여 60 자 제한을 무시할 수 있습니다 . 로 설정하면 Infinity모든 것이 단일 라인으로 출력됩니다 .

예쁜 인쇄에 대해 더 많은 제어를 원한다면 JSON.stringify()3rd argument와 함께 사용 하는 것을 고려 하지만 다음 사항에 유의하십시오.

  • 전역 컨텍스트에서 와 같이 순환 참조 가있는 객체로는 실패 합니다 module.
  • 방법 (기능)은 의도적으로 포함되지 않습니다.
  • 숨겨진 (열거 가능하지 않은) 속성을 표시하도록 선택할 수 없습니다.
  • 호출 예 :
    • JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces

util.inspect()옵션 객체 (두 번째 인수) :

형식화 된 문자열의 특정 측면을 변경 하는 선택적 옵션 오브젝트가 전달 될 수 있습니다. 지원되는 속성 중 일부 는 다음과 같습니다.

현재 전체 목록 은 최신 Node.js 문서 를 참조하십시오 .

  • showHidden

    • 인 경우 true객체의 열거 할 수없는 속성 [ for keys in obj또는 사용할 때 표시되지 않도록 지정된 속성 Object.keys(obj)]도 표시됩니다. 기본값은 false입니다.
  • depth

    • 개체의 서식을 지정하는 동안 되풀이 횟수를 검사합니다. 이것은 복잡한 대형 객체를 검사하는 데 유용합니다. 기본값은 2 null입니다. 무기한으로 되풀이하려면을 전달하십시오 .
  • colors

    • true 인 경우 출력은 ANSI 색상 코드로 스타일이 지정됩니다. 기본값은 false입니다. 색상을 사용자 정의 할 수 있습니다 [… – 링크 참조].
  • customInspect

    • 인 경우 검사중인 객체에 정의 된 false사용자 정의 inspect()함수가 호출되지 않습니다. 기본값은 true입니다.

util.format()형식 문자열 자리 표시 자 (첫 번째 인수)

지원되는 자리 표시 자 중 일부 는 다음과 같습니다.

현재 전체 목록 은 최신 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
좋은 트릭이지만 출력이 미리 확인되지 않으므로 큰 객체 (질문의 요점)를 읽기가 어렵습니다.
Dan Dascalescu

2
여전히 매우 유용하고, 빠른 복사 및 붙여 넣을 수 jsonlint.com 필요없이 utils:)
SSH이

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부터 options 객체를 두 번째 인수로 전달할 수 util.inspect()있습니다.
mklement0

21

당신은 또한 할 수 있습니다

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

19

객체를 검사하는 좋은 방법은 Chrome DevTools for Node 와 함께 node --inspect 옵션 을 사용하는 것 입니다.

node.exe --inspect www.js

열기 chrome://inspect/#devices크롬에서 클릭 노드에 대한 열기 전용 DevTools로

이제 기록 된 모든 객체는 크롬에서 실행되는 일반 JS와 같이 인스펙터에서 사용할 수 있습니다.

여기에 이미지 설명을 입력하십시오

인스펙터를 다시 열 필요가 없으며, 노드가 시작되거나 재시작되는 즉시 자동으로 노드에 연결됩니다. 이전 버전의 Node 및 Chrome에서는 --inspectChrome DevTools for Node를 모두 사용할 수 없습니다.


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세 번째 매개 변수는 예쁜 인쇄를위한 공백 삽입을 정의합니다. 문자열 또는 숫자 (공백 수) 일 수 있습니다.


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와 node shell 모두에 필요에 따라 표시됩니다


3

간단한 트릭은 스크립트를 실행할 때 debug모듈을 사용 DEBUG_DEPTH=null하여 환경 변수 로 추가 하는 것입니다.

전의.

DEBUG = * DEBUG_DEPTH = 널 노드 index.js

당신은 코드

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

@Bala 프로젝트 "npm install debug --save"에 "debug"모듈을 설치해야합니다
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.