Làm cách nào tôi có thể nhận được toàn bộ đối tượng trong console.log () của Node.js, thay vì '[Object]'?


894

Khi gỡ lỗi bằng cách sử dụng console.log(), làm thế nào tôi có thể có được đối tượng đầy đủ?

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

Đầu ra:

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

Nhưng tôi cũng muốn xem nội dung của tài sản f.

Câu trả lời:


1460

Bạn cần sử dụng 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 */))

Đầu ra

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

Xem util.inspect()tài liệu .


4
Giải pháp tốt đẹp. Mặc dù không cần chỉ định {showHidden: false} miễn là nó mặc định là false.
triển sinh thái

36
Tốt để biết; không chắc chắn khi nó được giới thiệu, nhưng ít nhất là nút áp dụng v0.10.33 console.log() ngầmutil.inspect() cho các đối số của nó, giả sử rằng cái đầu tiên không phải là một chuỗi định dạng. Nếu bạn hài lòng với util.inspect()các tùy chọn mặc định, đơn giản là console.log(myObject)sẽ làm - không cần phải yêu cầu util; console.dir()cũng làm như vậy, nhưng chỉ chấp nhận `đối tượng để kiểm tra; ít nhất v0.11.14, bạn có thể truyền đối tượng tùy chọn cho util.inspect()đối số thứ 2; Câu trả lời của tôi có nhiều chi tiết hơn.
mkuity0

4
@ mkuity0 Tôi có nút v5.3.0 và khi tôi console.log(obj)vẫn in [Đối tượng] cho các đối tượng được lồng sâu :( Tôi thực sự muốn nó hoạt động như bạn mô tả.
SSH

47
@SSH: console.log()luôn giới hạn ở 2 cấp (vì nó sử dụng util.inspect()mặc định 's mà không cho phép bạn thay đổi nó); console.dir()Theo mặc định có cùng giới hạn, nhưng bạn có thể chuyển vào một đối tượng tùy chọn làm đối số thứ 2 để thay đổi điều đó (được truyền qua util.inspect(); lưu ý rằng console.dir() chỉ có thể in 1 đối tượng một lần, tuy nhiên. Để in với độ sâu không giới hạn, hãy sử dụng console.dir(myObject, { depth: null }).
mkuity0

13
console.dir(myObject, { depth: null })là công việc cho tôi
Veck Hsiao

632

Bạn có thể sử dụng JSON.stringify, và nhận được một số thụt lề đẹp cũng như có thể dễ nhớ cú pháp hơn.

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

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

Đối số thứ ba đặt mức thụt lề, do đó bạn có thể điều chỉnh mức đó theo ý muốn.

Chi tiết hơn ở đây nếu cần:

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


2
cũng +1 cho ngắt dòng và thụt dòng - hầu như luôn luôn mong muốn đối với cá nhân tôi
toblerpwn

59
Lưu ý rằng bạn không thể JSON.opesify các đối tượng với các tham chiếu tròn . Giống như nó sẽ xảy ra với các đối tượng DOM chẳng hạn. Stringify sẽ đưa ra "Lỗi: Chuyển đổi cấu trúc vòng tròn thành JSON".
Ignacio Lago

11
đây không phải là đối tượng đầy đủ. các đối tượng chỉ chứa các hàm sẽ là {}. Tất nhiên đó có thể là tích cực hoặc tiêu cực tùy thuộc vào những gì bạn muốn in ra.
Lawrence Weru

1
console.log(JSON.stringify(myObject, null, 4));tuyệt đấy! https://gist.github.com/xgqfrms-GitHub/92aa2b00249f15084d24aa2e0a5d0300
xgqfrms

1
Trong trường hợp của tôi, tôi gặp lỗi này LoạiError: Chuyển đổi cấu trúc vòng tròn sang JSON
Prem Sanil

313

Một bản tổng hợp của nhiều câu trả lời hữu ích từ (ít nhất) Node.js v0.10.33(ổn định) / v0.11.14(không ổn định) có lẽ thông qua (ít nhất) v7.7.4(phiên bản hiện tại kể từ bản cập nhật mới nhất cho câu trả lời này). Mẹo đội mũ cho Rory O'Kane nhờ giúp đỡ.

tl; dr

Để có được đầu ra mong muốn cho ví dụ trong câu hỏi, hãy sử dụng console.dir():

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

Tại sao không util.inspect()? Bởi vì nó đã ở trung tâm của đầu ra chẩn đoán: console.log()console.dir()cũng như Node.js REPL sử dụng util.inspect() ngầm . Nói chung là không cần thiếtrequire('util') và gọi util.inspect()trực tiếp.

Chi tiết bên dưới.


  • console.log()(và bí danh của nó, console.info()):

    • Nếu đối số thứ nhất KHÔNG phải là chuỗi định dạng : util.inspect()được tự động áp dụng cho mọi đối số:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
      • Lưu ý rằng bạn không thể vượt qua các tùy chọn thông quautil.inspect() trong trường hợp này, trong đó hàm ý 2 hạn chế đáng chú ý:
        • Độ sâu cấu trúc của đầu ra được giới hạn ở 2 cấp độ (mặc định).
          • Vì bạn không thể thay đổi điều này với console.log(), thay vào đó, bạn phải sử dụng console.dir(): console.dir(myObject, { depth: null }bản in với độ sâu không giới hạn ; xem bên dưới.
        • Bạn không thể bật màu cú pháp.
    • Nếu đối số thứ nhất là chuỗi định dạng (xem bên dưới): sử dụng util.format()để in các đối số còn lại dựa trên chuỗi định dạng (xem bên dưới); ví dụ:
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
      • Ghi chú:
        • KHÔNG có chỗ giữ để đại diện cho các đối tượng util.inspect() style.
        • JSON được tạo với %jKHÔNG được in đẹp.
  • console.dir():

    • Chỉ chấp nhận 1 đối số để kiểm tra và luôn áp dụng util.inspect()- về cơ bản, một trình bao bọc util.inspect()không có tùy chọn theo mặc định; ví dụ:
      • 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 + : Đối số thứ 2 tùy chọn chỉ định các tùy chọn choutil.inspect() - xem bên dưới; ví dụ:
      • console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
  • REPL : in ngầm định bất kỳ giá trị trả về của biểu thức util.inspect() với màu cú pháp ;
    tức là, chỉ cần gõ tên của một biến và nhấn Enter sẽ in một phiên bản được kiểm tra về giá trị của nó; ví dụ:
    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect()tự động in các biểu diễn đối tượngmảng , nhưng chỉ tạo ra đầu ra đa dòng khi cần .

  • Hành vi in ​​đẹp có thể được kiểm soát bởi thuộc compacttính trong optionsđối số tùy chọn ; falsesử dụng đầu ra đa dòng vô điều kiện , trong khi truevô hiệu hóa hoàn toàn in ấn; nó cũng có thể được đặt thành một số (mặc định là 3) để điều khiển hành vi đa dòng có điều kiện - xem tài liệu .

  • Theo mặc định, đầu ra được bọc ở khoảng 60 ký tự , cảm ơn, Shrey , bất kể đầu ra được gửi đến một tệp hay thiết bị đầu cuối. Trong thực tế, vì ngắt dòng chỉ xảy ra ở ranh giới thuộc tính , bạn sẽ thường kết thúc bằng các dòng ngắn hơn, nhưng chúng cũng có thể dài hơn (ví dụ: với các giá trị thuộc tính dài).

  • Trong v6.3.0 +, bạn có thể sử dụng breakLengthtùy chọn để ghi đè giới hạn 60 ký tự; nếu bạn đặt nó vào Infinity, tất cả mọi thứ là sản lượng trên một đơn dòng.

Nếu bạn muốn kiểm soát nhiều hơn đối với in đẹp, hãy cân nhắc sử dụng JSON.stringify()với đối số thứ 3 , nhưng lưu ý những điều sau:

  • Thất bại với các đối tượng có tham chiếu vòng tròn , chẳng hạn như moduletrong bối cảnh toàn cầu.
  • Phương pháp (chức năng) sẽ theo thiết kế KHÔNG được bao gồm.
  • Bạn không thể chọn hiển thị các thuộc tính ẩn (không thể liệt kê).
  • Cuộc gọi ví dụ:
    • JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces

util.inspect()đối tượng tùy chọn (đối số thứ 2):

Một đối tượng tùy chọn tùy chọn có thể được thông qua làm thay đổi các khía cạnh nhất định của chuỗi được định dạng; một số thuộc tính được hỗ trợ là:

Xem các tài liệu Node.js mới nhất để biết danh sách đầy đủ, hiện tại.

  • showHidden

    • nếu true, thì các thuộc tính không thể đếm được của đối tượng [những thuộc tính được chỉ định không hiển thị khi bạn sử dụng for keys in objhoặc Object.keys(obj)] cũng sẽ được hiển thị. Mặc định cho false.
  • depth

    • cho biết kiểm tra bao nhiêu lần để lặp lại trong khi định dạng đối tượng. Điều này rất hữu ích để kiểm tra các đối tượng phức tạp lớn. Mặc định là 2. Để làm cho nó lặp lại vô thời hạn, hãy vượt qua null.
  • colors

    • nếu đúng, thì đầu ra sẽ được tạo kiểu với mã màu ANSI. Mặc định cho false. Màu sắc có thể tùy chỉnh [Khác - xem liên kết].
  • customInspect

    • nếu false, thì các inspect()hàm tùy chỉnh được xác định trên các đối tượng được kiểm tra sẽ không được gọi. Mặc định cho true.

util.format()giữ chỗ chuỗi định dạng (đối số thứ nhất)

Một số trình giữ chỗ được hỗ trợ là:

Xem các tài liệu Node.js mới nhất để biết danh sách đầy đủ, hiện tại.

  • %s - Chuỗi.
  • %d - Số (cả số nguyên và số float).
  • %j - JSON.
  • %%- dấu phần trăm đơn ('%'). Điều này không tiêu thụ một đối số.

1
Một cách để đơn giản hóa việc này là thực hiện một chức năng nhỏ có tên để thực hiện console.dir(...)mà không cần gõ tất cả: show = (v, depth=null)=> console.dir(v,{depth:depth})và sau đó gọi nó như vậy show(variable)hoặc show(variable, depth=1).
loco.loop

56

Một phương pháp đơn giản khác là chuyển đổi nó thành json

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

12
Thủ thuật hay nhưng đầu ra sẽ không được chỉnh sửa, điều này gây khó đọc cho các đối tượng lớn (điểm của câu hỏi).
Dan Dascalescu

2
vẫn rất hữu ích và nhanh chóng sao chép và dán vào jsonlint.com hơn yêu cầu utils:)
SSH

1
Tôi nghĩ cái này rất tuyệt khi bạn có một trình soạn thảo sẽ định dạng json cho bạn nhưng bạn chỉ cần sao chép nó từ REPL
jcollum

2
Điều này rất tiện dụng và hữu ích nếu đối tượng nhỏ
Chinmay Samant

43

Thử cái này:

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


24

có lẽ console.dirlà tất cả những gì bạn cần.

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

Sử dụng produc.inspect trên obj và in chuỗi kết quả thành thiết bị xuất chuẩn.

sử dụng tùy chọn sử dụng nếu bạn cần kiểm soát nhiều hơn.



Kể từ (ít nhất) v0.11,14, bạn có thể truyền một đối tượng tùy chọn làm đối số thứ 2, được truyền cho util.inspect().
mkuity0

21

Bạn cũng có thể làm

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

19

Một cách tốt để kiểm tra các đối tượng là sử dụng tùy chọn nút --inspect với Chrome DevTools cho Node .

node.exe --inspect www.js

Mở chrome://inspect/#devicesbằng chrome và nhấp vào Mở DevTools chuyên dụng cho Nút

Bây giờ mọi đối tượng được ghi lại đều có sẵn trong trình kiểm tra như JS thông thường chạy trong chrome.

nhập mô tả hình ảnh ở đây

Không cần phải mở lại thanh tra, nó tự động kết nối với nút ngay khi nút bắt đầu hoặc khởi động lại. Cả --inspectChrome DevTools cho Node có thể không có sẵn trong các phiên bản cũ hơn của Node và Chrome.


1
Một tin nhắn cho tôi: hãy thử nó ->node.exe --inspect index.js
Cô đơn

Điều này nên được đặt lên hàng đầu. câu trả lời tốt nhất. :)
princebillyGK

11

Cả hai cách sử dụng này đều có thể được áp dụng:

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

Tôi nghĩ rằng điều này có thể hữu ích cho bạn.

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

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

Như đã đề cập trong câu trả lời này :

JSON.stringifyTham số thứ ba xác định chèn khoảng trắng cho in ấn đẹp. Nó có thể là một chuỗi hoặc một số (số khoảng trắng).


4

Bạn có thể chỉ cần thêm một inspect()phương thức vào đối tượng của mình, nó sẽ ghi đè lên biểu diễn của đối tượng trong console.logtin nhắn

ví dụ:

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

sau đó, đối tượng của bạn sẽ được biểu diễn theo yêu cầu trong cả console.log và shell shell


3

Một mẹo đơn giản sẽ là sử dụng debugmô-đun để thêm DEBUG_DEPTH=nulldưới dạng biến môi trường khi chạy tập lệnh

Ví dụ.

DEBUG = * DEBUG_DEPTH = null nút index.js

Trong mã của bạn

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

@Bala Bạn sẽ cần cài đặt mô-đun "gỡ lỗi" trong dự án "npm install debug --save"
Chintan

2

Nút REPL có một giải pháp tích hợp để ghi đè cách hiển thị các đối tượng, xem tại đây .

Mô-đun REPL sử dụng nội bộ util.inspect(), khi in các giá trị. Tuy nhiên, util.inspectủy thác cuộc gọi đến inspect() chức năng của đối tượng , nếu nó có.



0

JSON.opesify ()

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

Tuyệt vời để kiểm tra sâu các đối tượng dữ liệu. Cách tiếp cận này hoạt động trên các mảng lồng nhau và các đối tượng lồng nhau với các mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.