Reputation:
I have this object:
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
But when I try to show it using console.log(myObject)
, I receive this output:
{ a: 'a', b: { c: 'c', d: { e: 'e', f: [Object] } } }
How can I get the full object, including the content of property f
?
Upvotes: 1537
Views: 1013590
Reputation: 437032
This answer draws on preexisting ones in an effort to provide a systematic overview.
Tip of the hat to Rory O'Kane and Mike 'Pomax' Kamermans for their help.
tl;dr
To get the desired output for the example in the question ad hoc, use console.dir()
:
console.dir(myObject, { depth: null }) // `depth: null` ensures unlimited recursion
Why not util.inspect()
? Because it’s already at the heart of diagnostic output: console.log()
and console.dir()
as well as the Node.js REPL use util.inspect()
implicitly. It’s generally not necessary to require('util')
and call util.inspect()
directly - unless you want to capture the object visualization in a variable rather than printing to the console (e.g., let s = util.inspect(myObject, { depth: null })
)
Alternatively, set the default depth to null
:
const util = require('util') // or: import util from 'util'
// Set the default depth to null to remove the recursion limit.
// All subsequent console.log() and console.dir() calls will use this default.
util.inspect.defaultOptions.depth = null
console.log(myObject) // or: console.dir(myObject)
Note: At least in recent Node.js versions, Infinity
works in lieu of null
too.
Details below.
console.log()
(and its alias, console.info()
):
util.inspect()
is automatically applied to every argument:
o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
util.inspect()
in this case, which implies 2 notable limitations:
console.log()
, you must instead use console.dir()
: console.dir(myObject, { depth: null }
prints with unlimited depth; see below.util.format()
to print the remaining arguments based on the format string (see below); e.g.:
o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
util.inspect()
-style.%j
is NOT pretty-printed.util.inspect()
– essentially, a wrapper for util.inspect()
without options by default; e.g.:
o = { one: 1, two: 'deux', foo: function(){} }; console.dir(o); // Effectively the same as console.log(o) in this case.
util.inspect()
– see below; e.g.:
console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
util.inspect()
with syntax coloring;o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.
util.inspect()
automatically pretty-prints object and array representations, but produces multiline output only when needed.
The pretty-printing behavior can be controlled by the compact
property in the optional options
argument; false
uses multi-line output unconditionally, whereas true
disables pretty-printing altogether; it can also be set to a number (the default is 3
) to control the conditional multi-line behavior – see the docs.
By default, output is wrapped at around 60 characters thanks, Shrey , regardless of whether the output is sent to a file or a terminal. In practice, since line breaks only happen at property boundaries, you will often end up with shorter lines, but they can also be longer (e.g., with long property values).
In v6.3.0+ you can use the breakLength
option to override the 60-character limit; if you set it to Infinity
, everything is output on a single line.
If you want more control over pretty-printing, consider using JSON.stringify()
with a 3rd argument, but note the following:
module
in the global context.JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces
util.inspect()
options object (2nd argument):
An optional options object may be passed that alters certain aspects of the formatted string; some of the properties supported are:
See the latest Node.js docs for the current, full list.
showHidden
true
, then the object's non-enumerable properties [those designated not to show up when you use for keys in obj
or Object.keys(obj)
] will be shown too. Defaults to false
.depth
null
.colors
false
. Colors are customizable [… – see link].customInspect
false
, then custom inspect()
functions defined on the objects being inspected won't be called. Defaults to true
.util.format()
format-string placeholders (1st argument)
Some of the supported placeholders are:
See the latest Node.js docs for the current, full list.
%s
– String.%d
– Number (both integer and float).%j
– JSON.%%
– single percent sign (‘%’). This does not consume an argument.Upvotes: 874
Reputation: 3929
Since Node.js 6.4.0, this can be elegantly solved with util.inspect.defaultOptions
:
require("util").inspect.defaultOptions.depth = null;
console.log(myObject);
Upvotes: 88
Reputation: 49
Replace the default console
by a customized console as following:
globalThis.console = new console.Console({
inspectOptions: {
depth:null,
},
stdout:process.stdout,
stderr:process.stderr,
});
Once the code block is executed, all output of the console.log
is formatted as you specified in the inspectOptions
.
If you already have a large amount of code which uses console.log
, replacing console might be the easiest way to solve the problem.
Accoding to the official reference of Node.js, creating customized consoles as new Console(options)
have been available since Node.js version 8.
Upvotes: 2
Reputation: 843
For NodeJs 16 and beyond, you can use the below snippet.
require(util).inspect(<your-object-here>, { showHidden: false, depth: null, maxArrayLength: null, maxStringLength: null })
Upvotes: 0
Reputation: 6508
My way :)
Define function
console.obj = (...args) => args.forEach(obj => console.log(require('util').inspect(obj, false, null, true)));
Usage
const test = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
const test2 = {
second: 'object'
};
console.obj(test, test2);
Upvotes: 0
Reputation:
You can use JSON.stringify
, and get some nice indentation as well as perhaps easier to remember syntax.
console.log(JSON.stringify(myObject, null, 4));
{
"a": "a",
"b": {
"c": "c",
"d": {
"e": "e",
"f": {
"g": "g",
"h": {
"i": "i"
}
}
}
}
}
The third argument sets the indentation level, so you can adjust that as desired.
More detail here in JSON stringify MDN docs if needed.
Upvotes: 997
Reputation: 188
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
console.log(JSON.stringify(myObject));
Output:
{"a":"a","b":{"c":"c","d":{"e":"e","f":{"g":"g","h":{"i":"i"}}}}}
Upvotes: 4
Reputation: 37131
You need to use util.inspect()
:
const util = require('util')
console.log(util.inspect(myObject, {showHidden: false, depth: null, colors: true}))
// alternative shortcut
console.log(util.inspect(myObject, false, null, true /* enable colors */))
Outputs
{ a: 'a', b: { c: 'c', d: { e: 'e', f: { g: 'g', h: { i: 'i' } } } } }
Upvotes: 2252
Reputation: 16294
Don't try to reinvent the wheel
util.inspect()
, JSON.stringify()
and console.dir()
are useful tools for logging an object while playing in the browser console.
If you are serious about Node.js development, you should definitely use a logger. Using it you can add all the logs you want for debugging and monitoring your application. Then just change the logging level of your logger to keep only the production logs visible.
Additionaly they have already solved all the annoying issues related to logging, like: circular objects, formatting, log levels, multiple outputs and performance.
pino
is a fast and modern logger for Node.js that has sane defaults to handle circular object/references like depthLimit
and edgeLimit
. It supports child loggers, transports and a pretty printed output.
Moreover, it has 8 default logging levels that you can customize using the customLevels
option:
fatal
error
warn
info
debug
trace
silent
npm install pino
const logger = require('pino')()
logger.info('hello world')
const logger = pino({
depthLimit: 10,
edgeLimit: 200,
customLevels: {
foo: 35
}
});
logger.foo('hi')
Upvotes: 10
Reputation: 591
You can simply add an inspect()
method to your object which will override the representation of object in console.log
messages
eg:
var myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
myObject.inspect = function(){ return JSON.stringify( this, null, ' ' ); }
then, your object will be represented as required in both console.log and node shell
Update:
object.inspect has been deprecated ( https://github.com/nodejs/node/issues/15549). Use myObject[util.inspect.custom] instead:
const util = require('util')
var myObject = {
/* nested properties not shown */
}
myObject[util.inspect.custom] = function(){ return JSON.stringify( this, null, 4 ); }
console.log(util.inspect(myObject))
Upvotes: 8
Reputation: 10340
If you're looking for a way to show the hidden items in you array, you got to pass maxArrayLength: Infinity
console.log(util.inspect(value, { maxArrayLength: Infinity }));
Upvotes: 5
Reputation: 514
Both of these usages can be applied:
// 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));
Upvotes: 34
Reputation: 6834
let myVar = {a: {b: {c: 1}}};
console.log(JSON.stringify( myVar, null, 4 ))
Great for deep inspection of data objects. This approach works on nested arrays and nested objects with arrays.
Upvotes: 8
Reputation: 307
I think this could be useful for you.
const myObject = {
"a":"a",
"b":{
"c":"c",
"d":{
"e":"e",
"f":{
"g":"g",
"h":{
"i":"i"
}
}
}
}
};
console.log(JSON.stringify(myObject, null, '\t'));
As mentioned in this answer:
JSON.stringify
's third parameter defines white-space insertion for pretty-printing. It can be a string or a number (number of spaces).
Upvotes: 13
Reputation: 634
A simple trick would be use debug
module to add DEBUG_DEPTH=null
as environment variable when running the script
Ex.
DEBUG=* DEBUG_DEPTH=null node index.js
In you code
const debug = require('debug');
debug("%O", myObject);
Upvotes: 4
Reputation: 22317
A good way to inspect objects is to use node --inspect option with Chrome DevTools for Node.
node.exe --inspect www.js
Open chrome://inspect/#devices
in chrome and click Open dedicated DevTools for Node
Now every logged object is available in inspector like regular JS running in chrome.
There is no need to reopen inspector, it connects to node automatically as soon as node starts or restarts. Both --inspect and Chrome DevTools for Node may not be available in older versions of Node and Chrome.
Upvotes: 26
Reputation: 8396
The node REPL has a built-in solution for overriding how objects are displayed, see here.
The REPL module internally uses
util.inspect()
, when printing values. However,util.inspect
delegates the call to the object'sinspect()
function, if it has one.
Upvotes: 2
Reputation: 8924
perhaps console.dir
is all you need.
http://nodejs.org/api/console.html#console_console_dir_obj
Uses util.inspect on obj and prints resulting string to stdout.
use util option if you need more control.
Upvotes: 31
Reputation: 2782
Another simple method is to convert it to json
console.log('connection : %j', myObject);
Upvotes: 73