可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
When debugging using console.log()
, how can I get the full object?
const myObject = {
\"a\":\"a\",
\"b\":{
\"c\":\"c\",
\"d\":{
\"e\":\"e\",
\"f\":{
\"g\":\"g\",
\"h\":{
\"i\":\"i\"
}
}
}
}
};
console.log(myObject);
Outputs:
{ a: \'a\', b: { c: \'c\', d: { e: \'e\', f: [Object] } } }
But I want to also see the content of property f
.
回答1:
You need to use 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 */))
Outputs
{ a: \'a\', b: { c: \'c\', d: { e: \'e\', f: { g: \'g\', h: { i: \'i\' } } } } }
See util.inspect()
docs.
回答2:
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 if needed:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
回答3:
A compilation of the many useful answers from (at least) Node.js v0.10.33
(stable) / v0.11.14
(unstable) presumably through (at least) v7.7.4
(the version current as of the latest update to this answer).
tl;dr
util.inspect()
is at the heart of diagnostic output: console.log()
and console.dir()
as well as the Node.js REPL use util.inspect()
implicitly, so it\'s generally not necessary to require(\'util\')
and call util.inspect()
directly.
To get the desired output for the example in the question:
console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion
Details below.
- The REPL: implicitly prints any expression\'s return value with
util.inspect()
with syntax coloring;
i.e., just typing a variable\'s name and hitting Enter will print an inspected version of its value; e.g.:
o = { one: 1, two: \'deux\', foo: function(){} } // echoes the object definition with syntax coloring.
util.inspect()
automatically (and invariably) pretty-prints object and array representations, but produces multiline output only when needed - if everything fits on one line, only 1 line is printed.
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:
- Fails with objects that have circular references, such as
module
in the global context.
- Methods (functions) will by design NOT be included.
- You can\'t opt into showing hidden (non-enumerable) properties.
- Example call:
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):
source: http://nodejs.org/api/util.html#util_util_format_format
An optional options object may be passed that alters certain aspects of the formatted string:
showHidden
- if
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
- tells inspect how many times to recurse while formatting the object. This is useful for inspecting large complicated objects. Defaults to 2. To make it recurse indefinitely, pass
null
.
colors
- if true, then the output will be styled with ANSI color codes. Defaults to
false
. Colors are customizable [... - see link].
customInspect
- if
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)
source: http://nodejs.org/api/util.html#util_util_format_format
%s
- String.
%d
- Number (both integer and float).
%j
- JSON.
%
- single percent sign (\'%\'). This does not consume an argument.
回答4:
Another simple method is to convert it to json
console.log(\'connection : %j\', myObject);
回答5:
Try this:
console.dir(myObject,{depth:null})
回答6:
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.
回答7:
You can also do
console.log(JSON.stringify(myObject, null, 3));
回答8:
Since Node.js 6.4.0, this can be elegantly solved with util.inspect.defaultOptions
:
require(\"util\").inspect.defaultOptions.depth = null;
console.log(myObject);
回答9:
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.
回答10:
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 });
// clear list of actual values
console.log(JSON.stringify(queryArgs, undefined, 2));
回答11:
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
回答12:
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);
回答13:
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\'s inspect()
function, if it has one.