ฉันจะรับวัตถุทั้งหมดใน console.log ของ Node.js ได้อย่างไรแทนที่จะเป็น '[Object]'


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


4
ทางออกที่ดี แม้ว่าไม่จำเป็นต้องระบุ {showHidden: false} ตราบใดที่ค่าเริ่มต้นเป็นเท็จ
พัฒนาซอฟต์แวร์

36
ดีแล้วที่รู้; ไม่แน่ใจว่าเมื่อมันถูกนำมาใช้ แต่อย่างน้อยที่สุดv0.10.33 console.log() โดยปริยายนำutil.inspect()ไปใช้กับข้อโต้แย้งของมันสมมติว่าคนที่ 1 ไม่ใช่สตริงรูปแบบ หากคุณมีความสุขอยู่กับutil.inspect()'s ตัวเลือกเริ่มต้นเพียงแค่console.log(myObject)จะทำ - ไม่จำเป็นที่จะต้องใช้util; console.dir()ทำสิ่งเดียวกัน แต่ยอมรับเฉพาะวัตถุที่จะตรวจสอบ อย่างน้อยที่สุดv0.11.14คุณสามารถผ่านอ็อพเจ็กอ็อพชั่นutil.inspect()เป็นอาร์กิวเมนต์ที่ 2; คำตอบของฉันมีรายละเอียดเพิ่มเติม
mklement0

4
@ mklement0 ฉันมีโหนด v5.3.0 และเมื่อฉันconsole.log(obj)ยังคงพิมพ์ [Object] สำหรับวัตถุที่ซ้อนกันอย่างลึก :( ฉันหวังว่ามันจะทำงานตามที่คุณอธิบาย
SSH

47
@SSH: console.log()ถูกจำกัด2ระดับอย่างคงเส้นคงวา (เพราะมันใช้ค่าเริ่มต้นโดยไม่อนุญาตให้คุณเปลี่ยน); มีค่า จำกัด ตามค่าเริ่มต้น แต่คุณสามารถส่งผ่านวัตถุตัวเลือกเป็นอาร์กิวเมนต์ที่ 2 เพื่อเปลี่ยน (ซึ่งถูกส่งผ่านไปยังโปรดทราบว่า สามารถพิมพ์ได้ครั้งละ1วัตถุเท่านั้นในการพิมพ์ด้วยความลึกไม่ จำกัด ให้ใช้.util.inspect()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"
Ignacio Lago

11
นี่ไม่ใช่วัตถุเต็ม วัตถุที่มีฟังก์ชั่นเท่านั้นจะเป็น {} แน่นอนว่าอาจเป็นบวกหรือลบขึ้นอยู่กับสิ่งที่คุณต้องการพิมพ์
Lawrence Weru

1
console.log(JSON.stringify(myObject, null, 4));เจ๋งมาก! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms

1
ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้ TypeError: การแปลงโครงสร้างแบบวงกลมเป็น JSON
เปรม 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()):

    • หากอาร์กิวเมนต์ที่ 1 ไม่ใช่สตริงรูปแบบ : 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 }พิมพ์ที่มีไม่ จำกัดลึก ; ดูด้านล่าง
        • คุณไม่สามารถเปิดการระบายสีไวยากรณ์
    • ถ้าอาร์กิวเมนต์ที่ 1 คือสตริงรูปแบบ (ดูด้านล่าง): ใช้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 + : อาร์กิวเมนต์ตัวเลือกที่ 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()โดยอัตโนมัติสวยพิมพ์วัตถุและอาร์เรย์การแสดงแต่ผลิตหลายเอาท์พุทเมื่อจำเป็นเท่านั้น

  • คุณสมบัติการพิมพ์แบบสวยสามารถควบคุมได้โดยcompactคุณสมบัติในoptionsอาร์กิวเมนต์ที่เป็นทางเลือก falseใช้เอาต์พุตหลายบรรทัดโดยไม่มีเงื่อนไขในขณะที่trueปิดใช้งานการพิมพ์ที่สวยงามทั้งหมด ก็ยังสามารถตั้งค่าให้เป็นจำนวน (เริ่มต้นคือ3) เพื่อควบคุมพฤติกรรมหลายสายเงื่อนไข - ดูเอกสาร

  • โดยค่าเริ่มต้นการส่งออกจะอยู่ที่ประมาณ 60 ตัวอักษรขอบคุณShrey ไม่ว่าจะส่งออกไปยังไฟล์หรือเทอร์มินัลก็ตาม ในทางปฏิบัติเนื่องจากการขึ้นบรรทัดใหม่เกิดขึ้นที่ขอบเขตคุณสมบัติเท่านั้นคุณมักจะจบลงด้วยเส้นที่สั้นกว่า แต่ก็สามารถยาวขึ้นได้เช่นกัน

  • ใน 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 ที่จะทำให้มัน recurse ไปเรื่อย ๆ 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
เคล็ดลับดี แต่ผลลัพธ์จะไม่ถูก prettified ซึ่งทำให้ยากต่อการอ่านสำหรับวัตถุขนาดใหญ่ (จุดของคำถาม)
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

ใช้ util.inspect บน obj และพิมพ์สตริงผลลัพธ์เป็น stdout

ใช้ตัวเลือก util ถ้าคุณต้องการการควบคุมเพิ่มเติม



ในฐานะของ (อย่างน้อย) v0.11.14 คุณสามารถส่งผ่านตัวเลือกวัตถุเป็นอาร์กิวเมนต์ที่ 2 util.inspect()ซึ่งส่งผ่านไปยัง
mklement0


19

วิธีที่ดีในการตรวจสอบวัตถุคือการใช้โหนด--inspectตัวเลือกกับChrome DevTools สำหรับโหนด

node.exe --inspect www.js

เปิดchrome://inspect/#devicesใน chrome และคลิกเปิด DevTools เฉพาะสำหรับโหนด

ตอนนี้ทุกวัตถุที่บันทึกไว้มีให้บริการในตัวตรวจสอบเช่น JS ปกติที่ทำงานในโครเมี่ยม

ป้อนคำอธิบายรูปภาพที่นี่

ไม่จำเป็นต้องเปิดตัวตรวจสอบอีกครั้งมันจะเชื่อมต่อกับโหนดโดยอัตโนมัติทันทีที่โหนดเริ่มทำงานหรือรีสตาร์ท ทั้ง--inspectและChrome DevTools สำหรับ Nodeอาจไม่สามารถใช้งานได้ใน 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พารามิเตอร์ที่สามของคำจำกัดความหมายถึงการแทรก white-space สำหรับการพิมพ์แบบสวย สามารถเป็นสตริงหรือตัวเลข (จำนวนช่องว่าง)


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 = null โหนด index.js

ในรหัสคุณ

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

@Bala คุณจะต้องติดตั้งโมดูล "debug" ในโครงการของคุณ "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.