Como Loggar um objeto no Node.js

Quando você digita console.log() em um programa JavaScript e o roda no browser, isso vai criar uma entrada bem legal no Console do Browser:

log no console exibindo um objeto

Ao clicar na flecha, o log é expandido, e você pode ver claramente as propriedades do objeto:

log expandido

No Node.js, o mesmo acontece.

Nós não temos tanto luxo quando logamos algo no console, porque isso vai retornar o objeto para o shell se você rodar o programa Node.js manualmente, ou para um arquivo de log. Você obtêm uma representação do objeto em formato de string.

Agora, tudo fica bem até um certo nível de aninhamento. Depois de dois níveis de aninhamento, o Node.js desiste e imprime [Object] como um placeholder:

const obj = {
name: 'pauloluan',
age: 35,
person1: {
name: 'Tony',
age: 50,
person2: {
name: 'Albert',
age: 21,
person3: {
name: 'Peter',
age: 23
}
}
}
}
console.log(obj)
{
name: 'pauloluan',
age: 35,
person1: {
name: 'Tony',
age: 50,
person2: {
name: 'Albert',
age: 21,
person3: [Object]
}
}
}

Como você pode imprimir o objeto inteiro?

A melhor maneira de fazer isso, preservando a beleza da saída, é usar:

console.log(JSON.stringify(obj, null, 2))

sendo 2 o número de espaços usados para identação.

Outra opção é usar

require('util').inspect.defaultOptions.depth = null
console.log(obj)

mas o problema é que objetos aninhados com mais de 2 níveis ficam planificados, e isso pode ser um problema com objetos complexos.