Node.js - console.log does not show items in array but instead shows [Object]

14,481

Solution 1

This is the default way for some browser and implementations of showing too complex or deep objects/arrays with console.log. An alternative is to use JSON.stringify with console.log:

var stuff = {
  accepted: ['item1', 'item2'],
  rejected: [],
  response: 'Foo',
  envelope: {
    from: 'The sender',
    to: ['new item1', 'new item2']
  },
  messageId: 'xxxxxxxxxxxxx'
}


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

EDIT:

Another alternative is to use console.dir in case you have a too complex or recursive object, see https://stackoverflow.com/a/27534731/6051261

Solution 2

It looks like this is an old topic, anyway

I've faced the same issue, embedded array printed as [Array].

It is because of console.log in the node.js uses util.inspect for print, the default depth is 2. So, to print something which is deeper than 2 followings can be used:

const util = require('util')
console.log(util.inspect(errors, true, 10))

Solution 3

Try it with: console.log(JSON.stringify(variable))

Share:
14,481
mikeym
Author by

mikeym

Updated on June 19, 2022

Comments

  • mikeym
    mikeym almost 2 years

    I have a problem with logging out the contents of an array inside an object. The actual object looks like this

       var stuff = { accepted: [ 'item1', 'item2' ],
             rejected: [],
             response: 'Foo',
             envelope: { from: 'The sender', to: ['new item1', 'new item2'] },
             messageId: 'xxxxxxxxxxxxx' } }
    

    The console.log shows the items of the first array fine but the second array is being output as [Object].

     { accepted: [ 'item1', 'item2' ],
                 rejected: [],
                 response: 'Foo',
                 envelope: { from: 'The sender', to: [Object] },
                 messageId: 'xxxxxxxxxxxxx' } } 
    

    What is happening here and how can I get the items of the second array to show when I console.log. Thanks for any help!

    UPDATE

    Sorry, I forgot to add that I am working exclusively in Node.js so it's a server side log that needs to display the object exactly as it's received from a callback with a straight console.log, ie. no further stringify-ing.

    I also just tried creating another random object with a similar structure like this.

     var objText = {
          fun: {
            stuff: 'Some stuff',
            list: ['this', 'it', 'takes']
          }
        };
    

    The console.log for the above is:

    { fun: { stuff: 'Some stuff', list: [ 'this', 'it', 'takes' ] } }
    

    This appears to be the same structure to me and yet the console.log works fine so it seems to be perfectly possible in Node to log arrays content even when it's embedded inside and an object inside an outer object.

  • mikeym
    mikeym almost 7 years
    Thanks for suggestion but I'm on Node 0.12 and can't upgrade at the moment.
  • Justin Case
    Justin Case about 3 years
    This should be the accepted answer: 1. console.log does use util.inspect with depth = 2 (hence the problem of OP), and 2. using the suggested solution does remedy the issue. Also, if you add last parameter to util.inspect and pass true, console.log will behave the same as before (e.g. show colours as well). Depth (here 10) can be adjusted accordingly.